我决定用Swift继续我剩下的项目。当我将自定义类(UIViewcontroller
的子类)添加到我的故事板视图控制器并加载项目时,应用程序突然崩溃并出现以下错误:
致命错误:使用未实现的初始化程序" init(编码器:)'对于班级
这是一段代码:
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.
}
*/
}
请提出建议
答案 0 :(得分:199)
这是由目标init?(coder aDecoder: NSCoder)
上缺少初始值设定项UIViewController
引起的。该方法是必需的,因为从UIViewController
实例化UIStoryboard
会调用它。
要了解我们如何从UIViewController
初始化UIStoryboard
,请查看here
因为 Objective-C 会自动继承所有必需的UIViewController
初始值设定项。
Swift 默认情况下不会因为安全而继承初始值设定项。但是如果所有属性都有值(或可选)并且子类没有定义任何指定的初始化器,它将继承超类中的所有初始化器。
在目标init?(coder aDecoder: NSCoder)
UIViewController
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
删除目标init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
上的UIViewController
将继承超类中所有必需的初始值设定项,因为 Dave Wood 指向下面的answer
答案 1 :(得分:26)
除了@ 3r1d之外的另一个选择是从你的类中删除以下init方法:
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
// Custom initialization
}
包含该init方法,可防止子类从其超类继承init(coder aDecoder: NSCoder!)
。如果不包括它,你的班级将继承它们。
注:参见WWDC 2014 Session 403" Intermediate Swift"在大约33:50的标记处了解更多细节。
答案 2 :(得分:9)
对于与swift UICollectionViewCells
存在相同问题的人,请将@ 3r1d建议的代码添加到自定义UICollectionViewCell
类,而不是添加到View Controller:
init(coder aDecoder: NSCoder!)
{
super.init(coder: aDecoder)
}
答案 3 :(得分:3)
对于那些需要Swift代码的人:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
[编辑]这是针对Swift的旧版本。可能不再工作了。
答案 4 :(得分:1)
我在程序化collectionView单元中遇到了这个问题,即使操作人员正在询问有关vc的问题,但在寻找答案时我仍然落在这个问题上。对我来说,问题是我确实有
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
已实现,因此最佳答案不起作用。我在单元格中没有的是初始化程序:
// my programmatic cell was missing this
override init(frame: CGRect) {
super.init(frame: frame)
}
一旦我添加了它,错误就消失了
答案 5 :(得分:0)
我没有添加一些使内部机制正常工作的方法,而是将我的属性定义为@lazy并在类范围内初始化它们。