Quel (s) initialiseur (s) à remplacer pour la sous-classe UITableViewController
J'ai un UITableViewController
sous-classe est instanciée, selon l'endroit où il est utilisé, dans une PLUME ou via le code. Dans les deux cas, je veux faire la personnalisation dans l'initialiseur de méthode. Est-ce à dire j'ai besoin de mettre en œuvre les deux initWithNibName:bundle:
et initWithCoder:
et serait chaque appel de méthode, de ses super initialiseur?
Alors que je n'ai pas besoin de ce droit maintenant, si je veux aussi être capable d'instancier la-vue-contrôleur avec initWithStyle:
? Aurais-je alors besoin de 3 différentes méthodes init qui reproduisent le même comportement?
Il semble que cela porte atteinte à l'ensemble désigné de l'initialiseur de la convention, comme il serait essentiellement 3 initialiseurs qui ne se retrouvent pas à l'appel d'une commune de la méthode init. Ou est-il un moyen de créer une commune désignée d'initialiseur, tout en soutenant les 3 instancier des routes?
source d'informationauteur Daniel Dickison
Vous devez vous connecter pour publier un commentaire.
Ma confusion était fondée sur la croyance erronée que chaque classe doit avoir un seul initialiseur. Ce n'est pas vrai, et dans le cas de
UITableViewController
il y a 3 désignés initialiseurs (autant que je puis dire):initWithStyle:
déclaré localementinitWithNibName:bundle:
hérité deUIViewController
initWithCoder:
de l'adoption deNSCoding
protocoleVous avez besoin de remplacer 1 ou plus de ces dans votre sous-classe en fonction de la façon dont votre sous-classe est instanciée. Dans mon cas, j'ai dû mettre en place #2 et #3 depuis la classe peut être chargé à partir d'une PLUME, ou instancié via le code en référence à la PLUME. (J'imagine que c'est rare que vous allez utiliser à la fois
initWithStyle:
etinitWithNibName:bundle:
pour une seule classe.)J'ai trouvé Apple Des Directives de codage pour le Cacao utile.
En interne,
-initWithStyle:
appelle la super de-init
puis définissez la_tableViewStyle
ivar.-init
appelle simplement-initWithNibName:bundle:
avec des arguments par défaut.-initWithNibName:bundle:
.Donc, si vous substituez
-initWithNibName:bundle:
puis-initWithStyle:
va adopter le changement. Bien sûr, pour jouer en toute sécurité (que vous ne devriez pas compter sur les détails de mise en œuvre), remplacer les deux d'entre eux.(Et pas besoin de surcharger
-initWithCoder:
à moins que vous ne l'onu/archive le cas.)Pour clarifier,
initWithStyle:
étantUITableViewController
's seulement publié initialiseur dans les docs, c'est sa explicites désigné initialiseur.initWithNibName:bundle:
est héritée de UIViewController et est désigné initialiseur pour la classe. En tant que tel, en conformité avec les lignes directrices de Cacao,UITableViewController
doit remplacer cette méthode (mise en œuvre). Cependant, cela n'est pas désigné un initialiseur deUITableViewController
.initWithCoder:
est, comme vous le soulignez, implicitement désigné de l'initialiseur deNSCoding
.Mettre en œuvre:
et de faire de votre composant d'initialisation.
Il a l'avantage de ne le faire que l'initialisation lorsque la vue est effectivement demandé.
Ou tout simplement faire un autre méthode de configuration invoquées par tous les initialiseurs.
Un plus pour les postes ci-dessus que la référence –initWithCoder:
Si vous avez ajouté la-vue-contrôleur à son parent via interface builder (par exemple: si le point de vue du contrôleur est connecté à un onglet de la barre de contrôleur dans interface builder), alors vous avez besoin de remplacer –initWithCoder.
(-initWithNibName ne sera appelée lorsque vous créez la vue-contrôleur de la programmation.)