2014-08-27 88 views
54

如何在Swift中將自定義初始值設定項添加到UIViewController子類中?Swift:自定義ViewController初始值設定項

我創建了一個子類的UIViewController,看起來是這樣的:

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

     super.init(); 

     setupScrollView(); 
     setupViewControllers(); 
    } 
} 

當我運行它,我得到一個致命的錯誤:

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

我讀過elewhere當添加一個自定義初始值設定項也必須覆蓋init(coder aDecoder:NSCoder),所以讓我們覆蓋該init,看看會發生什麼:

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

如果我添加這個,Xcode抱怨self.leftVC is not initialized at super.init call。所以我想這也不是解決方案。所以我想知道如何將Swift中的自定義初始化程序正確地添加到ViewController子類中(因爲在Objective-C中,這似乎不成問題)?

+0

怎樣的,你試圖實例你'MyViewController'? – 2014-08-27 12:58:16

+0

爲什麼不實例化viewDidLoad()中的所有東西,在那裏你可以初始化他們只是你想要的方式 – tudoricc 2014-08-27 12:59:57

+0

@MikePollard與dualViewCtrl = DualViewCtrl(leftVC:l,rightVC:r,gap:50)...我已經發現我需要使用initWithNib初始值設定項。 – BadmintonCat 2014-08-27 13:01:09

回答

74

解決了!一個人必須調用指定的初始化,在這種情況下是nibName,顯然在init ...

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

它爲我工作。 – 2014-11-05 05:33:45

+22

擺脫那些醜陋的分號:) – MobileMon 2015-03-31 19:48:30

+6

我喜歡分號。它們使代碼更加模糊,尤其是那些可笑的Cocoa/Cocoa-Touch API名稱和簽名。 Swift設計人員將其刪除的錯誤決定恕我直言。 – BadmintonCat 2015-06-07 14:30:06

8

不知道如果你設法徹底解決這個...但是這取決於你如何想你的類接口看看你是否真的需要編碼器功能,您還可以使用如下:

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

由於init:leftVC:rightVC:gap是指定初始化,你可以通過它方便的初始化調用完成實施init:coder的要求,你的指定的初始化器。

這可能是比

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

,因爲如果你需要初始化一些屬性,那麼你就需要重寫他們。

+3

請解釋downvote – wlingke 2015-08-20 15:53:01

5

對於一個更通用的UIViewController你可以使用這個作爲雨燕2.0

init() { 
    super.init(nibName: nil, bundle: nil) 
} 
相關問題