2014-08-27 25 views
54

Wie fügen Sie benutzerdefinierte Initialisierungen zu UIViewController Unterklassen in Swift hinzu?Swift: Benutzerdefinierte ViewController-Initialisierer

ich eine Unterklasse von UIViewController erstellt haben, die etwa wie folgt aussieht:

class MyViewController : UIViewController 
{ 
    init(leftVC:UIViewController, rightVC:UIViewController, gap:Int) 
    { 
     self.leftVC = leftVC; 
     self.rightVC = rightVC; 
     self.gap = gap; 

     super.init(); 

     setupScrollView(); 
     setupViewControllers(); 
    } 
} 

Wenn ich es laufen lasse, bekomme ich einen fatalen Fehler:

fatal error: use of unimplemented initializer 'init(nibName:bundle:)' for class 'MyApp.MyViewController'

ich gelesen habe, dass, wenn elewhere Hinzufügen eines benutzerdefinierten Initialisierer muss man auch übersteuern init(coder aDecoder:NSCoder) also lass uns das überschreiben init und sehen, was passiert:

override init(coder aDecoder: NSCoder) 
{ 
    super.init(coder: aDecoder); 
} 

Wenn ich dies hinzufügen, beschwert Xcode, dass self.leftVC is not initialized at super.init call. Ich denke, das kann auch nicht die Lösung sein. Also frage ich mich, wie kann ich benutzerdefinierte Initialisierungen richtig zu einer ViewController Unterklasse in Swift hinzufügen (da in Objective-C scheint dies kein Problem zu sein)?

+0

Wie können versuchen Sie Ihr 'MyViewController' zu instanziiert? –

+0

Warum instantiieren Sie alles in viewDidLoad(), dort können Sie sie so initialisieren, wie Sie wollen – tudoricc

+0

@MikePollard mit dualViewCtrl = DualViewCtrl (leftVC: l, rightVC: r, lücke: 50) ... Ich habe schon herausgefunden, dass ich muss Verwenden Sie den InitWithNib-Initialisierer. – BadmintonCat

Antwort

74

Gelöst es! Man hat den benannten Initialisierer zu nennen, die in diesem Fall ist die init mit nibName, offensichtlich ...

init(leftVC:UIViewController, rightVC:UIViewController, gap:Int) 
{ 
    self.leftVC = leftVC 
    self.rightVC = rightVC 
    self.gap = gap 

    super.init(nibName: nil, bundle: nil) 

    setupScrollView() 
    setupViewControllers() 
} 
+0

Es hat für mich funktioniert. –

+22

Werden Sie diese hässlichen Semikolons los :) – MobileMon

+6

Ich mag Semikolons. Sie machen Code weniger zweideutig, vor allem mit diesen lächerlich ausführlichen Cocoa/Cocoa-Touch API-Namen und -Signaturen. Schlechte Entscheidung von den Swift-Designern, sie IMHO zu entfernen. – BadmintonCat

8

Nicht sicher, ob Sie diese vollständig zu lösen geschafft ... aber je nachdem, wie Sie Ihre Klasse Schnittstelle wollen aussehen und ob Sie tatsächlich die Coder-Funktionalität benötigen, können Sie auch die unten verwenden:

convenience required init(coder aDecoder: NSCoder) 
{ 
    //set some defaults for leftVC, rightVC, and gap 
    self.init(leftVC, rightVC, gap) 
} 

Seit init:leftVC:rightVC:gap ist ein ausgewiesener initializer, können Sie die Anforderung erfüllen init:coder Umsetzung durch eine Bequemlichkeit initializer machen, die Anrufe Ihrer benannter Initialisierer.

sein Dies könnte besser als

override init(coder aDecoder: NSCoder) 
{ 
    super.init(coder: aDecoder); 
} 

, denn wenn Sie einige Eigenschaften initialisieren müssen, dann müssten Sie sie neu zu schreiben.

+3

bitte erklären Sie downvote – wlingke

5

Für eine allgemeinere UIViewController Sie dies als von Swift 2,0

init() { 
    super.init(nibName: nil, bundle: nil) 
} 
Verwandte Themen