Je construis avec la version finale de Xcode 7.0. Pas de storyboards, juste des fichiers nib.
J'ai un seul UINavigationController
créé par le délégué de l'application et l'initialise avec un contrôleur de vue.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController *viewController = [[TGMainViewController alloc] initWithNibName:nil bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
self.navigationController.navigationBar.hidden = YES;
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
Après avoir navigué vers une nouvelle vue en utilisant:
TGRoutePreparationViewController *viewController = [[TGRoutePreparationViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:viewController animated:YES];
Puis en revenant en utilisant:
[self.navigationController popViewControllerAnimated:YES];
Je reçois l'erreur suivante:
Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UIAlertController: 0x7b29a600>)
Bien que j'utilise UIAlertController
s dans l'application, aucun n'est utilisé ni instancié avant de recevoir cette erreur. Cela se produit uniquement lors de l'exécution sous iOS 9.0. L'exécution sous iOS 8.4 ne génère aucune erreur. Dans tous les cas, l'application semble fonctionner normalement et la navigation semble fonctionner.
Je soupçonne que l'erreur est trompeuse, mais comment puis-je résoudre ce problème?
Pour @Nick, voici la méthode dealloc utilisée:
- (void)deregisterNotificationHandlers {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)dealloc {
[self deregisterNotificationHandlers];
}
J'ai finalement pu retrouver une variable de classe UIActionSheet
dans une bibliothèque tierce, Mapbox GL.
J'ai ouvert un problème avec cette équipe de développement: https://github.com/mapbox/mapbox-gl-native/issues/2475
Crédit partiel (et vote positif et prime) à @Aaoli pour avoir indiqué que UIAlertView
était une variable de classe.
J'ai eu le même problème avec mon UIViewController
où je ne déclarais que variable dans ma classe let alert = UIAlertView()
sans l'utiliser encore, il s'agissait de toutes les fonctions situées à l'intérieur de la classe en tant que variable. en supprimant cela résout le problème. Vérifiez donc dans votre classe si vous avez défini l'alerte de UIAlertView
ou UIAlertViewController
comme cela sans l'utiliser ou dans la variable de classe!
Nous avons eu le même problème avec UIAlertController
.
let alert = UIAlertController(title: "", message: "", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: {(action : UIAlertAction!) in
//some actions
} ))
J'avais oublié d'ajouter la ligne suivante. Au-dessous de la ligne a résolu le problème.
self.presentViewController(alert, animated: true, completion: nil)
J'ai résolu ce problème en déplaçant une partie de mon code vers viewDidAppear
. Si j'utilisais UIAlertController
, cela causerait le même problème que vous avez mentionné et ne serait pas affiché, et je l'ai résolu de la même manière.
Faites-moi savoir si cela ne fonctionne pas!
Dans mon cas, dans Swift 3, j'avais raté le code ci-dessous après avoir ajouté l'action
presentViewController(theAlert, animated: true, completion: nil)
Donc, le code de travail est comme ci-dessous
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete) {
let title = "Delete ????"
let message = "Are you sure you want to delete this item?"
let theAlert = UIAlertController(title: title,
message: message,
preferredStyle: .ActionSheet)
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
theAlert.addAction(cancelAction)
let onDelete = UIAlertAction(title: "Delete", style: .Destructive, handler: { (action) -> Void in
self.items.removeAtIndex(indexPath.row)
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
})
theAlert.addAction(onDelete)
presentViewController(theAlert, animated: true, completion: nil)
}
}
// Note j'utilisais un exemple de tableau
var items = ["iPhone", "iPad", "Mac"]
J'ai eu ce problème car je n'avais pas de navigationController
... Je sais que cela peut paraître évident, mais je me suis mis à sauter dans différents projets, celui-ci n'avait pas de UINavigationController
à portée de main .... alors les autres viennent ici. vous voudrez peut-être NSLog
votre contrôleur de navigation uniquement pour des raisons de santé mentale ...
J'avais le même problème lorsque j'ai essayé de supprimer un observateur "frame" de ma vue dans une sous-classe UIViewController
. J'ai résolu ce problème en encapsulant le removeObserver
dans une isViewLoaded()
. Qu'observez-vous exactement?