web-dev-qa-db-fra.com

UIViewControllerHierarchyInconsistency lors de la tentative de présentation d'un contrôleur de vue modale

Essayer de présenter un contrôleur 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 à avoir 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, me demande ce qui pourrait causer une telle erreur? 

36
Sam J.

Cela m'est déjà arrivé deux fois dans la dernière version de Xcode . Dans les deux cas, je devais apporter des modifications au fichier XIB d'UIViewController (dans ce cas, ce serait MapViewController.xib:

AVANT:

enter image description here

  1. Déplacer la vue principale hors de Contrôleur de vue enfants :
  2. Remove View Controller de XIB (cela n'est pas nécessaire car File's Owner devrait déjà être de sa classe):

APRÈS:

enter image description here

146
Lukasz

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

L'équivalent du correctif ci-dessus, à savoir modifier le fichier MixerHostViewController.xib fourni en faisant glisser l'objet View vers le niveau supérieur, et en supprimant le ViewController maintenant vide qui fonctionnait auparavant, fonctionnait parfaitement (mais pas avant des heures de travail le problème sous-jacent, je me sens donc complètement vaincu par Apple - ils semblent avoir resserré quelque chose mais ne se sont pas donné la peine de vérifier si leur exemple d'applications était cassé).

8
JulianSymes

J'ai eu ce problème quand ma nib avait une UIViewController dans le fichier au plus haut niveau. Le chargement depuis Nib a donc créé UIViewController, puis j’ai essayé de l’utiliser depuis ma classe, qui occupait la position MapViewController dans votre code.

Dans mon cas, la solution consistait simplement à supprimer la UIViewController de mon fichier Nib.

4
Bryan

Dans certains cas, il est peut-être préférable de prendre une autre approche et pas de supprimer le contrôle UIViewController de la carte d’authentification, car, en supprimant le contrôleur de vue de la hiérarchie de la carte, vous perdez les marges de la disposition automatique.

Pourquoi ne pas simplement laisser UIViewController dans votre nib (.xib) et créer un point de vente dans la classe propriétaire du fichier? Ensuite, plutôt que d’instancier directement le contrôleur de vue dans votre code, chargez le nib avec la classe UINib et, au moment optimal (du point de vue de l’utilisation de la mémoire/des ressources), appelez la méthode instantiateWithOwner () de l’instance de nib pour désarchiver la NIB et vous connecter. les objets nib dans les prises de la classe 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)
0
clearlight

Tu devrais 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];
0
Paresh Navadiya