Ceci est très similaire aux autres réponses, mais avec quelques explications. La réponse acceptée est trompeuse car sa propriété est facultative et n'expose pas le fait que votre init?(coder: NSCoder)
DOIT initialiser chaque propriété et la seule solution à cela est d'avoir un fatalError()
. En fin de compte, vous pourriez vous en sortir en rendant vos propriétés optionnelles, mais cela ne répond pas vraiment à la question du PO.
// 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")
}
}
Vous devez essentiellement ABANDON le charger à partir du storyboard. Pourquoi?
Parce que quand vous appelez un viewController storyboard.instantiateViewController(withIdentifier: "viewController")
alors UIKit fera sa chose et appel
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
Vous ne pouvez jamais rediriger cet appel vers une autre méthode init.
Documents sur instantiateViewController(withIdentifier:)
:
Utilisez cette méthode pour créer un objet contrôleur de vue à présenter par programme. Chaque fois que vous appelez cette méthode, elle crée une nouvelle instance du contrôleur de vue à l'aide de la init(coder:)
méthode.
Pourtant, pour les viewController créés par programme ou les viewControllers créés par nib, vous pouvez rediriger cet appel comme indiqué ci-dessus.