致命错误:对类使用未实现的初始化程序'init(coder :)'

我决定继续我的剩余的项目与Swift语言。当我在故事板viewcontroller中添加自定义类(.swift类的子类UIViewcontroller),并加载项目的应用程序崩溃突然出现以下错误

致命错误:对类使用未实现的初始化程序'init(coder :)'

这是一个代码:

import UIKit class TestViewController: UIViewController { init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) // Custom initialization } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } /* // #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ } 

请提出一些build议,

问题

这是由于目标UIViewController上没有initializer init?(coder aDecoder: NSCoder)的。 该方法是必需的,因为从UIStoryboard实例化UIViewController调用它。

看看我们如何从UIStoryboard初始化一个UIViewController ,请看看这里

为什么Objective-C不是问题?

因为Objective-C自动inheritance了所有需要的UIViewController初始值设定项。

为什么Swift不自动inheritance初始化器?

由于安全, Swift默认不会inheritance初始值设定项。 但是如果所有的属性都有一个值(或者是可选的)并且子类没有定义任何指定的初始值设定项,它将inheritance所有的超类的初始值设定项。


1.第一种方法

在目标UIViewController上手动实现init?(coder aDecoder: NSCoder)

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

2.第二种方法

在你的目标UIViewController上删除init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)将会inheritance超类中所有必需的初始化器,就像Dave Wood在他的答案中指出的那样


除了@ 3r1d之外的另一个select是从您的类中删除以下init方法:

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

包括该init方法,可防止子类从其超类inheritanceinit(coder aDecoder: NSCoder!) 。 通过不包括它,你的课程将inheritance两者。

注意:有关更多详细信息,请参阅WWDC 2014 Session 403“中级快速”(约33:50分)。

对于具有与swift UICollectionViewCells相同的问题的人,将@ 3r1dbuild议的代码添加到您的自定义UICollectionViewCell类而不是View Controller:

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

对于那些需要Swift代码的人:

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

[编辑]这是一个老版本的Swift。 可能不再工作了。

而不是添加一些方法使内部机制正常工作,我会去定义我的属性为@lazy,并在类作用域中初始化它们。