Dies ist den anderen Antworten sehr ähnlich, jedoch mit einigen Erklärungen. Die akzeptierte Antwort ist irreführend, da ihre Eigenschaft optional ist und nicht die Tatsache init?(coder: NSCoder)aufdeckt , dass Sie jede einzelne Eigenschaft initialisieren MÜSSEN und die einzige Lösung dafür darin besteht, eine zu haben fatalError(). Letztendlich könnten Sie davonkommen, indem Sie Ihre Immobilien optional machen, aber das beantwortet die Frage des OP nicht wirklich.
// 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")
}
}
Sie müssen es im Grunde verlassen, um es vom Storyboard zu laden. Warum?
Denn wenn man einen Viewcontroller ruft storyboard.instantiateViewController(withIdentifier: "viewController")dann UIKit wird seine Sache und Telefonieren
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
Sie können diesen Aufruf niemals an eine andere init-Methode umleiten.
Dokumente zu instantiateViewController(withIdentifier:):
Verwenden Sie diese Methode, um ein View Controller-Objekt zu erstellen, das programmgesteuert dargestellt werden soll. Jedes Mal, wenn Sie diese Methode aufrufen, wird mithilfe der init(coder:)Methode eine neue Instanz des Ansichtscontrollers erstellt .
Für programmgesteuert erstellte viewController- oder nib-erstellte viewController können Sie diesen Aufruf jedoch wie oben gezeigt umleiten.