2014-10-11 77 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