wake-up-neo.com

UIViewControllerHierarchyInconsistency, wenn versucht wird, einen modalen View-Controller darzustellen

Versuch, einen Controller für modale Ansicht mit dem folgenden Code darzustellen

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

Immer die folgende Fehlermeldung erhalten ..

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

Dies ist ein altes Projekt, das ich seit Monaten nicht mehr berührt habe. Ich frage mich, was einen solchen Fehler verursachen könnte. 

36
Sam J.

Das ist mir in der neuesten Xcode-Version schon zweimal passiert. In beiden Fällen musste ich Änderungen an der XIB-Datei von UIViewController vornehmen (In diesem Fall wäre es MapViewController.xib

VOR:

enter image description here

  1. Hauptansicht aus Ansicht Controller Kinder verschieben :
  2. Entfernen Sie View Controller von der XIB (dies ist nicht erforderlich, da der Besitzer der Datei sollte bereits seiner Klasse angehören):

NACH DEM:

enter image description here

146
Lukasz

Dieses Problem hatte ich, als ich Apples Beispiel-App MixerHost auf dem iOS 6-Simulator ausführte.

Das Äquivalent des obigen Fixes, nämlich das Bearbeiten der bereitgestellten MixerHostViewController.xib, indem das View-Objekt auf die oberste Ebene gezogen und der jetzt leere ViewController verworfen wurde, der ihn enthielt, funktionierte einwandfrei (obwohl ich nicht stundenlang gearbeitet hatte herauszufinden, was das zugrunde liegende Problem war, also fühle ich mich im Moment von Apple erledigt - anscheinend verschärften sie etwas, schauten aber nicht nach, ob ihre Beispiel-Apps kaputt gegangen waren.

8
JulianSymes

Ich hatte dieses Problem, als meine Spitze eine UIViewController in der Datei auf oberster Ebene hatte. Beim Laden von Nib wurde dann UIViewController erstellt. Dann habe ich versucht, es aus meiner Klasse zu verwenden, die in Ihrem Code die Position MapViewController war.

In meinem Fall bestand die Lösung darin, einfach die UIViewController aus meiner Nib-Datei zu entfernen.

4
Bryan

In einigen Fällen ist es möglicherweise besser, den UIViewController aus einer anderen NIB zu wählen und nicht zu löschen. Denn durch das Entfernen des View-Controllers aus der Hierarchie der NIB gehen die Ränder des automatischen Layouts verloren.

Warum lassen Sie den UIViewController nicht einfach in Ihrer Feder (.xib) und erstellen einen Auslass für ihn in der Klasse der Dateieigentümer? Laden Sie dann die Feder mit der UINib-Klasse, anstatt den View-Controller direkt in Ihrem Code zu instanziieren, und rufen Sie zum optimalen Zeitpunkt (vom Standpunkt der Speicher-/Ressourcennutzung aus) die instantiateWithOwner () - Methode der Spitzeninstanz auf, um die Archivierung der NIB und die Verbindung aufzuheben Die Spitze wendet sich an die Auslässe der Besitzerklasse. 

    @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

Sie sollten es so machen ..

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