UIViewControllerHierarchyInconsistency lors de la tentative de présentation d'un controller de vue modale

Essayer de présenter un controller de vue modale avec le code suivant

MapViewController *mapView = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil]; mapView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self.navigationController presentModalViewController:mapView animated:YES]; [mapView release]; 

Continuez à get l'erreur suivante ..

 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UIView: 0x1ed815a0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x1ed81600>> is associated with <UIViewController: 0x1ed835a0>. Clear this association before associating this view with <MapViewController: 0x1dd947c0>.' 

C'est un vieux projet que je n'ai pas touché depuis des mois, je me request ce qui pourrait causer une telle erreur?

Cela m'est déjà arrivé deux fois dans la dernière version de Xcode. Dans les deux cas, j'ai dû apporter des modifications au file XIB de UIViewController (dans votre cas, il s'agirait de MapViewController.xib:

AVANT:

entrez la description de l'image ici

  1. Déplacer la vue principale des enfants de View Controller:
  2. Supprimez View Controller du XIB (ce n'est pas nécessaire puisque le propriétaire du file doit déjà être de sa class):

APRÈS:

entrez la description de l'image ici

J'ai eu ce problème lors de l'exécution de l'exemple d'application audio Apple MixerHost sur le simulateur iOS 6.

L'équivalent du correctif ci-dessus, à savoir éditer le file MixerHostViewController.xib fourni en faisant glisser l'object View au niveau supérieur et en supprimant le ViewController désormais vide qui le contenait, a parfaitement fonctionné (même si je n'avais pas travaillé pendant des heures sur ce que le problème sous-jacent était, donc je me sens fait – par Apple pour le moment – semble qu'ils ont resserré quelque chose, mais n'a pas pris la peine de vérifier si elle a brisé leurs exemples d'applications).

J'ai eu ce problème quand mon Nib avait un UIViewController dans le file au niveau supérieur. Donc le chargement de Nib a créé ce UIViewController , puis j'ai essayé de l'utiliser depuis ma class, qui était dans la position de MapViewController dans votre code.

Dans mon cas, la solution était simplement de supprimer le UIViewController de mon file Nib.

Vous devriez le faire comme ça ..

 MapViewController *mapView = [[MapViewController alloc] initWithNibName:@"MapViewController" bundle:nil]; UINavigationController *navCntrlr = [[UINavigationController alloc] initWithRootViewController:mapView]; mapView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; //hide navigation bar if needed [self.navigationController presentModalViewController:navCntrlr animated:YES]; [mapView release]; 

Dans certains cas, il est peut-être préférable d'adopter une autre approche et de ne pas supprimer UIViewController de la NIB. En effet, en supprimant le controller de vue de la hiérarchie NIB, vous perdez les marges Auto Layout.

Pourquoi ne pas simplement laisser UIViewController dans votre plume (.xib) et créer une sortie dans la class du propriétaire du file? Ensuite, plutôt que d'instancier le controller de vue directement dans votre code, chargez la puce avec la class UINib et, au moment optimal (du sharepoint vue utilisation memory / ressource), appelez la méthode instantiateWithOwner () de l'instance de nib pour désarchiver NIB et connectez la plume s'objecte aux points de vente de la class propriétaire.

  @IBOutlet var myViewController: myViewController? var nib : UINib? nib = UINib(nibName: "TheNib", bundle: nil) if (nib == nil) { println("could not load nib: TheNib.xib") } nib!.instantiateWithOwner(self, options: nil)