2016-05-05 17 views
6

Ich hatte eine MyViewController.swift und eine MyViewController.xib präsentiert das Layout von MyViewController.Laden ViewController von Xib-Datei

Ich habe versucht, verschiedene Methoden einschließlich dieses View-Controller zu laden:

//1 
let myVC = UINib(nibName: "MyViewController", bundle: 
     nil).instantiateWithOwner(nil, options: nil)[0] as? MyViewController 

//2 
let myVC = NSBundle.mainBundle().loadNibNamed("MyViewController", owner: self, options: nil)[0] as? MyViewController 

//3 
let myVC = MyViewController(nibName: "MyViewController", bundle: nil) 

Der dritte die einzige erfolgreiche Initialisierung ist, aber die letzten beiden verursachen Fehler:

Terminating app due to uncaught exception 'NSUnknownKeyException',

reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key XXX.

Was mit denen los Ladeverfahren?

+0

können Sie den vollständigen Code zu sehen –

+0

@bluenowhere alle Ausgänge Überprüfen Sie erstellt haben und mit Komponenten verbunden. Achten Sie darauf, dass in den 'Outlets' im' connection Inspector' in Ihrer '.xib' Datei kein Ausrufezeichen steht. –

+0

bluenowhere: Hast du deine Antwort gefunden? –

Antwort

0

Try Code unten,

// 1

let nib = UINib(nibName: "MyViewController", bundle:nil) 
myVC = nib.instantiateWithOwner(self, options: nil)[0] as? MyViewController 

ODER

myVC = nib.instantiateWithOwner(self, options: nil).first as? MyViewController 

// 2

let nib : NSArray = NSBundle.mainBundle().loadNibNamed("MyViewController", owner: self, options: nil) 
myVC = nib.objectAtIndex(0) as? MyViewController 

Dies funktioniert.

+1

Bitte nicht nur Code erklären, was Fehler war und wie Ihr Code hilft, es zu lösen :) –

+0

Ja, wie Sie die verschiedenen Fähigkeiten zum Schreiben von Code sehen können. Irgendwann wird es nicht möglich sein, innerhalb einer Zeile Code zu initialisieren. –

2

Das Problem ist nicht mit den Methoden ... Sie haben wahrscheinlich einen Auslass (XXX) gehalten einige UIElement verbunden und haben es von entsprechenden Controller entfernt ... Ich füge Beispiel unten ... enter image description here

die oben-Taste ist nun mit der Steuerung, aber wenn ich Ausgang Kommentar enter image description here

meine app stürzt enter image description here

enter image description here

so versuchen Ausgang zu finden (xxx), die von Viewcontroller fehlt aber in xib file.Hope it :)

6

File's Owner

Beachten Sie die File's Owner hilft. In Ihrem Fall ist die File's OwnerMyViewController.

Und die folgenden Codes, wenn es in Klasse Foo ausgeführt wird.

// If `self` is an instance of `Foo` class. 
// In this case, `File's Owner` will be a `Foo` instance. 
let myVC = NSBundle.mainBundle().loadNibNamed("MyViewController", owner: self, options: nil)[0] as? MyViewController 

Es self als owner passieren. So ist die File's OwnerFoo, nicht MyViewController. Dann können für Foo Klasse, die IBOutlet nicht mit Foo verbunden werden, es ist für MyViewController. Also, es stürzt ab.

24

Swift 3

let myViewController = MyViewController(nibName: "MyViewController", bundle: nil) 
self.present(myViewController, animated: true, completion: nil) 

oder eindrücken Navigationssteuerung

self.navigationController!.pushViewController(MyViewController(nibName: "MyViewController", bundle: nil), animated: true) 
+1

Dies ist die richtige Antwort. – Woodstock

+0

@Woodstock: Art von! Es ist die richtige Antwort auf die Frage 'Wie lade ich * das Layout von * einem ViewController aus einer XIB-Datei'. Die ursprüngliche Frage ist jedoch mehrdeutig, da OP nicht zu unterscheiden scheint zwischen (1) Laden des Layouts (View) eines programmatisch instanziierten ViewControllers von einem XIB und (2) Laden der ViewController-Instanz * selbst * aus dem XIB . AechoLius Antwort ist die richtige Antwort auf die zweite Interpretation :-) –

+0

@ChrisHatton Messepunkt! – Woodstock

0

I hatte das gleiche Problem. Die automatisch generierte Xib hatte eine UIView in sich.Sie müssen die Ansicht löschen, einen neuen View-Controller zur Xib hinzufügen, die View-Controller-Klasse auf die gewünschte setzen und dann die Ausgänge verbinden. Nachdem all dies können Sie die Codes oben angegebenen verwenden, um eine Instanz dieser View-Controller zu erhalten, wie folgt aus:

if let menuVC = Bundle.main.loadNibNamed("MenuViewController", owner: nil, options: nil)?.first as? MenuViewController { 
      menuVC.profileType = profileType 
      vc.present(menuVC, animated: true, completion: nil) 
     }