这与其他答案非常相似,但有一些解释。接受的答案是误导性的,因为它的属性是可选的,并且没有暴露你的init?(coder:NSCoder)
必须初始化每个属性的事实,唯一的解决方法是使用fatalError()
。最终,您可以通过使属性变成可选项来获得解决,但这并不能真正回答OP的问题。
class ViewController: UIViewController {
let name: String
override func viewDidLoad() {
super.viewDidLoad()
}
init(name: String) {
self.name = name
super.init(nibName: nil, bundle: nil)
}
init(name: String, nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle? ) {
self.name = name
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
init?(name: String, coder aDecoder: NSCoder) {
self.name = "name"
super.init(coder: aDecoder)
}
required init?(coder aDecoder: NSCoder) {
fatalError("I WILL NEVER instantiate through storyboard! It's impossible to initialize super.init?(coder aDecoder: NSCoder) with any other parameter")
}
}
你基本上必须放弃从storyboard中加载它。为什么?
因为当你调用一个viewController storyboard.instantiateViewController(withIdentifier: "viewController")
,然后UIKit会做它的事情并调用
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
你永远无法将该调用重定向到另一个init方法。
instantiateViewController(withIdentifier:)
的文档:
使用此方法以编程方式创建视图控制器对象。每次调用此方法时,它都会使用init(coder:)
方法创建视图控制器的新实例。
但对于以编程方式创建的viewController或使用nib创建的viewControllers,您可以像上面显示的那样重定向该调用。