これは他の回答とよく似ていますが、いくつか説明があります。プロパティはオプションでありinit?(coder: NSCoder)
、すべてのプロパティを初期化する必要があるという事実とその唯一の解決策がを持っているという事実を公開していないため、受け入れられた回答は誤解を招くものですfatalError()
。最終的には、プロパティをオプションにすることで回避できますが、それはOPの質問に正確に答えるものではありません。
// Think more of a OnlyNibOrProgrammatic_NOTStoryboardViewController
class ViewController: UIViewController {
let name: String
override func viewDidLoad() {
super.viewDidLoad()
}
// I don't have a nib. It's all through my code.
init(name: String) {
self.name = name
super.init(nibName: nil, bundle: nil)
}
// I have a nib. I'd like to use my nib and also initialze the `name` property
init(name: String, nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle? ) {
self.name = name
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
// when you do storyboard.instantiateViewController(withIdentifier: "ViewController")
// The SYSTEM will never call this!
// it wants to call the required initializer!
init?(name: String, coder aDecoder: NSCoder) {
self.name = "name"
super.init(coder: aDecoder)
}
// when you do storyboard.instantiateViewController(withIdentifier: "ViewController")
// The SYSTEM WILL call this!
// because this is its required initializer!
// but what are you going to do for your `name` property?!
// are you just going to do `self.name = "default Name" just to make it compile?!
// Since you can't do anything then it's just best to leave it as `fatalError()`
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")
}
}
基本的に、ストーリーボードからABANDONでロードする必要があります。どうして?
あなたはViewControllerをを呼び出したときなのでstoryboard.instantiateViewController(withIdentifier: "viewController")
、その後UIKitはその事と呼び出しを行います
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
その呼び出しを別のinitメソッドにリダイレクトすることはできません。
上のドキュメントinstantiateViewController(withIdentifier:)
:
このメソッドを使用して、プログラムで表示するビューコントローラーオブジェクトを作成します。このメソッドを呼び出すたびに、このメソッドを使用してビューコントローラの新しいインスタンスが作成されますinit(coder:)
。
しかし、プログラムで作成されたviewControllerまたはnibで作成されたviewControllersの場合、上記のようにその呼び出しをリダイレクトできます。