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.
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:
NACH DEM:
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.
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.
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)
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];