이것은 다른 답변과 매우 유사하지만 약간의 설명이 있습니다. 허용되는 대답은 속성이 선택 사항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")
}
}
기본적으로 스토리 보드에서로드하는 것을 포기해야합니다. 왜?
viewController storyboard.instantiateViewController(withIdentifier: "viewController")
를 호출하면 UIKit 이 작업을 수행하고
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
해당 호출을 다른 init 메서드로 리디렉션 할 수 없습니다.
의 문서 instantiateViewController(withIdentifier:)
:
이 메서드를 사용하여 프로그래밍 방식으로 표시 할 뷰 컨트롤러 개체를 만듭니다. 이 메서드를 호출 할 때마다 다음을 사용하여 뷰 컨트롤러의 새 인스턴스를 만듭니다.init(coder:)
.
그러나 프로그래밍 방식으로 생성 된 viewController 또는 nib 생성 된 viewController의 경우 위와 같이 해당 호출을 리디렉션 할 수 있습니다.