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?
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:
APRÈS:
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é).
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.
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)
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];