2014-08-27 55 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) 
} 
相关问题