So laden Sie eine XIB mit einer top-level-ViewController?
Habe ich eine Feder mit einem view-controller root-element wie diesem:
so kann ich die position der Elemente relativ zu den oberen und unteren layout-Führungen mit auto-layout.
Wenn ich das erste mal versucht zu laden, diese Feder mit
SearchViewControllerPro* searchViewController = [[SearchViewControllerPro alloc]initWithNibName:@"SearchViewControllerPro" bundle:[NSBundle mainBundle]];
Habe ich die folgenden run-time exception:
Terminating app due to uncaught exception
'NSInternalInconsistencyException', reason: '-[UIViewController
_loadViewFromNibNamed:bundle:] geladen "SearchViewControllerPro" Spitze, aber die Aussicht Steckdose war nicht gesetzt.'
Googlen der Fehler war es mich darauf hingewiesen, dass der Besitzer der Datei der xib benötigt, um eingestellt werden zu der Klasse von meiner view-controller und die view-Steckdose gesetzt werden musste, um das view-Objekt in der xib. Wenn ich so, dann erhalte ich folgenden Laufzeitfehler:
Terminating app due to uncaught exception
'UIViewControllerHierarchyInconsistency', reason: 'Ein Blick nur
verbunden höchstens mit einem view-controller gleichzeitig! Ansicht > zugeordnet ist . Klar, dieser Verein vor die Beteiligung dieser Ansicht mit
.'
Nicht kommen als eine überraschung, da die Ansicht verbunden ist, sowohl für den Eigentümer der Datei und die top-level-view-controller der Spitze. Aber wie kann ich sagen, der Lauf-Zeit, dass Sie beide in der Tat das gleiche, statt zwei getrennte Einheiten?
Edit:
Wenn ich versuche, unpck der ViewController aus der Feder so
NSArray* xibContents = [[NSBundle mainBundle] loadNibNamed:@"SearchViewControllerPro" owner:nil options:nil];
SearchViewControllerPro* mapSearchViewController = [xibContents lastObject];
kann es nicht gut:
Terminating app due to uncaught exception 'NSUnknownKeyException',
Grund: '[ setValue:forUndefinedKey:]: diese Klasse
ist nicht die key-value-coding-konform für die key-view.
Temporäre Lösung:
Ich habe eine Lösung gefunden, aber es ist nicht schön. Trotz der Struktur, wie gezeigt in IB, der view-controller wird 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 diese scheint zu funktionieren ohne Laufzeit abstürzt. Allerdings ist er alles andere als sauberer code.
- In Bezug auf Ihre Bearbeitung.. Sie haben Fehler in Ihrer Miene. Sie müssen sicherstellen, dass Klassen-und Dateinamen korrekt sind, und Sie müssen manuell entfernen Sie alle fehlerhaften verbindungen, die Sie gemacht. Was haben Sie als die Klasse der FilesOwner? Welche verbindungen haben Sie zu FilesOwner?
- Ok es ist egal, was Sie setzen in der Klasse von FilesOwner so lange, wie Sie erkennen, es wird sich ändern, je nachdem, ob Sie [NSBundle mainBundle] loadNibNamed:... oder SearchViewControllerPro alloc]initWithNibName:... also alle verbindungen, die Sie vorgenommen haben, FilesOwner ungültig (Sie stürzt ab), wenn Sie sich ändern, loading-Methode
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht, weil Sie nicht die gleiche Sache. Sie haben zwei
SearchViewControllerPro
intstances.Müssen Sie entweder alloc-init ein SearchViewControllerPro Instanz oder entpacken ein aus einer Feder.
Wenn Sie sich entscheiden, erstellen Sie die ViewController in der Spitze der übliche Weg, Zugang es ist die gleiche Weise würden Sie Zugriff auf ein anderes Element (view, button, textfield), die Sie erstellen, in eine Spitze.
Fügen Sie eine Steckdose, um die FilesOwner Objekt, schließen Sie die Verbindung im interface builder, und gebt das Objekt, wenn Sie entpacken Sie die Spitze.
zB Wenn Sie möchten, dass das Objekt, das unarchives die Feder zu FilesOwner:
ViewController
aus dem inneren der Feder, hatte aber kein Glück (siehe mein edit oben, ist es das, was du meinst?). Auf deinen Kommentar: ja, ich weiß, dass jetzt habe ich zwei Instanzen. Was ich sagen wollte ist, will ich beheben und Sie in das gleiche Objekt und nicht wissen, wie zu tun, dass im IB oder code, da die alloc-initing versagt (siehe Fehler oben).UIViewController
. Da für iOS7, die ich brauche um Sie neu zu positionieren Elemente relativ zu den topLayoutGuide, hatte ich, um ein view-controller als top-level-element eine Feder, und meine versuche, es zu laden, so weit versagt haben. Sie beschreiben das symptom richtig - aufgrund der Struktur der Feder und die Art und Weise habe ich versucht zu instanziieren der view-controller, bekomme ich zwei Objekte. Aber ich weiß nicht einrichten, der nib und der be-nennen, so dass ich am Ende nur noch ein. Ich hoffe, das erklärt es besser.[[NSBundle mainBundle] loadNibNamed:
- er ruftviewDidLoad
intern. Also, wenn wir einige Eigenschaften von view-controller-code, um Sie inviewDidLoad
Methode, wir treffen uns ein problem...Folgende Werke als gut und (zumindest für mich) ein wenig deutlicher, dass die Schaffung eines Absatzmarktes für die ViewController: