2013-09-25 12 views
7

Ich habe eine Feder mit einem View-Controller-Wurzelelement wie folgt erhält:Wie lade ich ein XIB mit einem ViewController auf oberster Ebene?

enter image description here

so kann ich Elemente relativ zu der oberen und unteren Layoutführungsposition Auto-Layout.

Als ich versuchte, diese Feder ersten

SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]]; 

I Ausnahme bekam die folgende Laufzeit mit zu laden:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "SearchViewControllerPro" nib but the view outlet was not set.'

googeln dem Fehler wurde mich darauf hingewiesen, dass die Eigentümer-Datei der Xib musste auf die Klasse meines View-Controllers eingestellt werden und der View-Outlet musste auf das View-Objekt in der Xib gesetzt werden. Wenn ich dies tue, dann erhalte ich die folgenden Laufzeitfehler:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View > is associated with . Clear this association before associating this view with .'

nicht als Überraschung Kommt da der Blick auf assoziiert ist sowohl den Dateieigentümer und der Top-Level-View-Controller der Spitze. Aber wie kann ich die Laufzeit feststellen, dass beide tatsächlich dasselbe sind anstatt zwei separate Entitäten?

Edit: Wenn ich versuche, wie so die Viewcontroller von der Spitze zu unpck,

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject]; 

, tut es auch nicht gut:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.

Vorübergehende Lösung:

Ich habe eine Lösung gefunden, aber es ist nicht schön. Trotz der in IB gezeigten Struktur ist der View-Controller nicht das letzte Objekt in der Xib. Also ich habe:

__block SearchViewControllerPro* mapSearchViewController = nil; 
[xibContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[SearchViewControllerPro class]]) { 
     mapSearchViewController = obj; 
    } 
}]; 

und dies scheint ohne Laufzeitabstürze zu arbeiten. Es ist jedoch alles außer sauberer Code.

+0

in Bezug auf Ihre bearbeiten .. Sie Fehler in Ihrer Feder haben. Sie müssen sicherstellen, dass die Klassennamen korrekt sind und Sie alle von Ihnen vorgenommenen Verbindungen manuell trennen müssen. Was hast du als Klasse von FilesOwner festgelegt? Welche Verbindungen haben Sie zu FilesOwner hergestellt? – hooleyhoop

+0

Ok es ist egal, was Sie die Klasse von FilesOwner setzen, solange Sie wissen, dass es sich ändert, je nachdem, ob Sie [NSBundle mainBundle] loadNibNamed: ... oder SearchViewControllerPro alloc] initWithNibName: ... also irgendwelche Verbindungen Sie an FilesOwner gemacht werden ungültig sein (Sie werden abstürzen), wenn Sie laden Methode – hooleyhoop

Antwort

4

Sie können nicht, weil sie nicht das gleiche sind. Sie haben zwei SearchViewControllerPro intstances erstellt.

Sie müssen entweder eine SearchViewControllerPro-Instanz zuweisen oder eine Instanz von einer Nib-Instanz entfernen.

Wenn Sie sich entscheiden, den ViewController in der Nib zu erstellen, erfolgt der Zugriff auf dieselbe Weise wie auf andere Elemente (Ansicht, Schaltfläche, Textfeld), die Sie in einer Nib erstellen.

Fügen Sie dem FilesOwner-Objekt eine Steckdose hinzu, verbinden Sie die Verbindung im Interface Builder, und stellen Sie sicher, dass das Objekt beim Auspacken der Feder übergeben wird.

zB wenn Sie das Objekt möchten, dass die Feder unarchives FilesOwner sein:

[[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:self options:nil]; 
+0

Vielen Dank für Ihre Antwort. Ich bin mir nicht sicher, ob ich es verstehe. Ich habe gerade versucht, den '' ViewController'' aus der Spitze zu holen, hatte aber kein Glück (siehe oben meine Bearbeitung, meinst du das?). Auf deinen Kommentar: Ja, ich weiß, dass ich gerade zwei Instanzen habe. Was ich sagen wollte, ist, dass ich sie in dasselbe Objekt auflösen möchte und nicht weiß, wie man das in IB oder Code macht, da das Alloc-Initing fehlschlägt (siehe Fehler oben). – Chris

+0

Was würde es bedeuten, 'zwei Instanzen in dasselbe Objekt aufzulösen'? Wenn ich das tue: ob1 = [SearchViewControllerPro alloc] init]; ob2 = [SearchViewControllerPro alloc] init]; (Und das hast du getan) Wie würde ich sie auf eine Instanz auflösen? Zwei Objekte sind zwei Objekte. – hooleyhoop

+2

Lassen Sie mich die Frage neu formulieren: Ich weiß, wie man eine Feder als Ansicht in einen '' UIViewController'' lädt. Da ich für iOS7 Elemente relativ zum topLayoutGuide neu positionieren muss, musste ich einen View-Controller als Top-Level-Element in eine Nib setzen, und meine Versuche, es bisher zu laden, sind fehlgeschlagen. Sie beschreiben das Symptom richtig - aufgrund der Struktur der Spitze und der Art, wie ich den View-Controller instanziieren wollte, erhalte ich zwei Objekte. Aber ich weiß nicht, wie ich die Spitze und den Lade-Ruf aufstellen soll, damit ich nur einen einzigen habe. Ich hoffe das erklärt es besser. – Chris

3

folgende Arbeiten auch und (zumindest für mich) ist ein wenig deutlicher, dass ein Ventil für die Viewcontroller zu erstellen:

NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil]; 
SearchViewControllerPro* mapSearchViewController = [xibContents objectAtIndex:0]; 
0
if (isIPad) 
{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPad" owner:self 
options:nil]; 

} 
else{ 
    [[NSBundle mainBundle] loadNibNamed:@"ABC_iPhone" owner:self options:nil]; 

} 
+0

Obwohl dieser Code helfen kann, das Problem zu lösen, erklärt er _why_ und/oder _how_ es nicht die Frage. Die Bereitstellung dieses zusätzlichen Kontextes würde seinen langfristigen Bildungswert erheblich verbessern. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erläuterung hinzuzufügen, einschließlich der Einschränkungen und Annahmen. –