2014-10-11 76 views
4

我想製作一個自定義容器視圖控制器,並將一些成員添加到UIViewController的子類中。當我嘗試使用下面的代碼從應用程序的委託初始化它:Swift中UIViewController的子類成員的雙重初始化

self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
self.window?.rootViewController = CustomContainerViewController() 
self.window?.makeKeyAndVisible() 

所有CustomContainerViewController成員被初始化兩次。

這裏是CustomContainerViewController的代碼:

class CustomContainerViewController: UIViewController { 
    let tabBar = CustomTabBar() 

    override init() { 
     super.init() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nibNameOrNil?, bundle: nibBundleOrNil?) 
    } 
} 

這裏是CustomTabBar的代碼:

class CustomTabBar: UIView { 
    override init(){ 
     println("init") 
     super.init() 
    } 
    override init(frame: CGRect) { 
     println("initWithFrame:") 
     super.init(frame: frame) 
    } 
    required init(coder aDecoder: NSCoder) { 
     println("initWithCoder:") 
     super.init(coder: aDecoder) 
    } 
} 

每當你使用前面提到的代碼初始化從應用程序委託的CustomContainerViewController,總是打印「init」,「initWithFrame」兩次。

回答

5

指定的初始化器使用不正確。

UIViewController只有一個指定的初始化程序init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)

正如其評論說

指定初始化。如果您繼承UIViewController,則即使您未使用NIB,也必須調用此方法的超級實現。 (爲了方便起見,默認的init方法將爲您執行此操作,併爲這兩個方法參數指定nil)。在指定的NIB中,文件所有者代理應將其類設置爲您的視圖控制器子類,並使用視圖插座連接到主視圖。如果你用一個nil nib名稱調用這個方法,那麼這個類的-loadView方法將嘗試加載一個名稱與你的視圖控制器類相同的NIB。如果實際上不存在這樣的NIB,則必須調用-setView:在調用-view之前,或者重寫-loadView方法以編程方式設置視圖。

所以每當你覆蓋的UIViewControllerinit()方法,一旦你調用super,UIViewController的實施將調用init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)代表你。因此,UIViewController的子類中的所有成員都初始化了兩次。

爲了解決這個問題,使用下面的代碼在應用程序委託

self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
self.window?.rootViewController = CustomContainerViewController(nibName: nil, bundle: nil) 
self.window?.makeKeyAndVisible() 

而且從來沒有調用UIViewControllerinit()方法或在子類中重寫此方法。

+0

它爲我說「額外論證」捆綁'在通話中「,爲什麼? – Caipivara 2014-12-05 13:23:14

+0

檢查你的咒語和變量類型 – WeZZard 2014-12-05 14:01:26

+0

我猜你每天都會學到新的東西。 +1 – 2015-01-24 10:17:20