web-dev-qa-db-fra.com

Tentative de chargement de la vue d’un contrôleur de vue alors qu’il désalloue ... UIAlertController

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 UIAlertControllers 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];
}
38
picciano

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.

6
picciano

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!

47
AaoIi

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)
5
Photon Point

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!

4
Sheamus

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"]
1
Naishta

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 ...

0
Magoo

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?

0
fruitcoder