Comment ajouter des initialiseurs personnalisés aux UIViewController
sous-classes dans Swift?
J'ai créé une sous-classe de UIViewController
qui ressemble à ceci:
class MyViewController : UIViewController
{
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int)
{
self.leftVC = leftVC;
self.rightVC = rightVC;
self.gap = gap;
super.init();
setupScrollView();
setupViewControllers();
}
}
Lorsque je l'exécute, j'obtiens une erreur fatale:
erreur fatale: utilisation de l'initialiseur non implémenté 'init (nibName: bundle :)' pour la classe 'MyApp.MyViewController'
J'ai lu ailleurs que lors de l'ajout d'un initialiseur personnalisé, il faut également remplacer, init(coder aDecoder:NSCoder)
alors remplaçons cela init
et voyons ce qui se passe:
override init(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder);
}
Si j'ajoute cela, Xcode s'en plaint self.leftVC is not initialized at super.init call
. Je suppose donc que cela ne peut pas non plus être la solution. Je me demande donc comment puis-je ajouter correctement des initialiseurs personnalisés à une ViewController
sous - classe dans Swift (puisque dans Objective-C cela ne semble pas être un problème)?
la source
MyViewController
?Réponses:
Résolu! Il faut appeler l'initialiseur désigné qui dans ce cas est le init avec nibName, évidemment ...
init(leftVC:UIViewController, rightVC:UIViewController, gap:Int) { self.leftVC = leftVC self.rightVC = rightVC self.gap = gap super.init(nibName: nil, bundle: nil) setupScrollView() setupViewControllers() }
la source
Pour un UIViewController plus générique, vous pouvez l'utiliser à partir de Swift 2.0
init() { super.init(nibName: nil, bundle: nil) }
la source
Je ne sais pas si vous avez réussi à résoudre complètement cela ... mais en fonction de l'apparence de l'interface de votre classe et du besoin ou non de la fonctionnalité de codeur, vous pouvez également utiliser ce qui suit:
convenience required init(coder aDecoder: NSCoder) { //set some defaults for leftVC, rightVC, and gap self.init(leftVC, rightVC, gap) }
Puisqu'il
init:leftVC:rightVC:gap
s'agit d'un initialiseur désigné, vous pouvez remplir l'exigence d'implémentationinit:coder
en en en faisant un initialiseur pratique qui appelle votre initialiseur désigné.Cela pourrait être mieux que
override init(coder aDecoder: NSCoder) { super.init(coder: aDecoder); }
car si vous avez besoin d'initialiser certaines propriétés, vous devrez les réécrire.
la source
Swift 5
Si vous souhaitez écrire un initialiseur personnalisé sur
UIViewController
lequel est initialisé avecstoryBoard.instantiateViewController(withIdentifier: "ViewControllerIdentifier")
Vous pouvez écrire un initialiseur personnalisé uniquement pour les
Optional
propriétés.class MyFooClass: UIViewController { var foo: Foo? init(with foo: Foo) { self.foo = foo super.init(nibName: nil, bundle: nil) } public required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.foo = nil } }
la source