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.