致命错误:对类使用未实现的初始化程序'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,并在类作用域中初始化它们。