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