Swift: Laden Sie die XIB-beim instanziieren viewcontroller

Ich habe vor kurzem aktualisiert mein Projekt Swift, und ich versuche, herauszufinden, wie zu instanziieren meine XIBs dynamisch, während die Aufrechterhaltung der starken Referenzen zu meiner viewcontrollers. Ich hasse es zu nennen NSBundle.mainBundle().loadNibNamed("someXib") denn eine string-Darstellung Ihrer viewcontroller kann, machen es anfällig für Tippfehler, hart daran zu erinnern, was jeder XIB benannt ist, und sehr schwer zu benennen Sie ein XIB-wenn ich das so wählen.

In objective-c, ich würde einfach erzeugen der viewcontroller, und schieben Sie es etwa so:

CRMyViewController *myVC = [CRMyViewController new];
[self.navigationController presentViewController:myVC animated:YES completion:nil];

Dies ermöglicht es mir zu stark-Referenz meines viewcontrollers (und deren zugehörige XIB -) und wenn ich es falsch geschrieben oder umbenannt meiner viewcontroller, mein Projekt einfach nicht kompilieren.

Als ich versuchte, diesen Ansatz verweisen auf eine Swift-XIB, meine Ansicht noch nie geladen. Aber ich war in der Lage, dicht zu bekommen, was ich wollte, indem Sie einfach überschreiben loadView in meinem viewcontroler:

override func loadView() {              
    NSBundle.mainBundle().loadNibNamed("CRMyViewController", owner:self, options:nil) 
}

Dies ist in der Nähe, was ich will, da ich nur hard-code, der xib-Namen einmal (und innerhalb der eigentlichen viewcontroller) aber ich würde trotzdem lieber einen dynamischeren Ansatz.

Gibt es eine Möglichkeit zum laden der Swift-XIB zusammen mit dem viewcontroller dynamisch? Das einzige, was ich denken kann ist meine eigene base-viewcontroller und überschreiben Sie die loadView in einem dynamischen Mode:

override func loadView() {        
    var className:NSString = NSStringFromClass(self.classForCoder)
    className = className.componentsSeparatedByString(".").last as NSString
    NSBundle.mainBundle().loadNibNamed(className, owner:self, options:nil)
}

Gibt es einen besseren Ansatz zum laden der XIB-zusammen mit den viewcontroller? Kommen, wie dies notwendig ist, schnell und nicht objective-c?

  • Ich verstehe nicht ganz den ersten Teil deiner Frage. Instanziieren eines neuen view-controller in Objective-C sollte nicht geladen haben, ist Ihre Spitze entweder, es sei denn, die view-controller war der laden der nib-in-code in sich. Es sollte nicht anders sein in Swift. Es gab keine Möglichkeit in Objective-C zu laden, eine Feder ohne Angabe der nib-Namen nur, da es keinen Weg in Swift.
  • So mache ich es jedes mal in objective-c. Alles, was ich tun instanziieren Sie den viewcontroller und präsentieren es und meine xib/Ansicht geladen wird zusammen mit ihm. Ich habe nicht haben, etwas zu tun Lust wie der swift-code oben.
  • Es sieht aus wie ich falsch bin. Die nib-Dokumentation erwähnt die Verknüpfung von view-Controller und eine dazugehörige Feder. Ich habe noch nie verwendet es so vor. Scheint zerbrechlich. Ich werde versuchen zu Graben, in der Sie mehr und sehen, was Los ist.
  • Mein Erster Gedanke ist, dass, weil der Swift-Klasse-name ist nicht das gleiche wie in Objective C, der _loadViewFromNibNamed wird nicht funktionieren. Ich werde versuchen, einige weitere details später.
InformationsquelleAutor Oren | 2015-01-25
Schreibe einen Kommentar