2010-01-24 7 views
4

J'ai remarqué que si vous chargez des vues connectées à partir d'une plume, vous devez surcharger initWithCoder si vous voulez ajouter du code d'initialisation parce que l'initialisateur désigné n'est pas appelé (ce qui est logique) et si vous ne chargez pas la vue d'une plume puis le même code doit être exécuté dans l'initialiseur désigné.Quelle est la manière correcte d'exécuter le code d'initialisation si un objet est chargé à partir d'une plume ou créé par programmation?

Donc, pour gérer les deux cas, vous avez besoin du même code d'initialisation dans les deux méthodes.

C'est la meilleure solution que j'ai trouvée jusqu'à présent, mais je me demande s'il existe une façon plus conventionnelle de le faire. Ce code est dans une sous-classe UITableViewCell mais il pourrait être tout UIView vraiment:

/* 
* Seems like there should be a standard method for this already. 
*/ 
- (void)didFinishInitializingOrUnacrhiving { 
    /*** Do stuff that makes the most sense to do in an initializer. ***/ 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if (self = [super initWithCoder:aDecoder]) { 
     [self didFinishInitializingOrUnacrhiving]; 
    } 
    return self; 
} 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 
     [self didFinishInitializingOrUnacrhiving]; 
    } 
    return self; 
} 

Donc, toute pensée à ce sujet? Est-ce la «bonne façon» de faire les choses, y a-t-il des pièges potentiels ici, ou est-ce que je manque complètement quelque chose?

+3

Soyez conscient que lorsque vous utilisez -initWithCoder: d'autres objets que votre récepteur doit envoyer des messages à ne pas avoir été initié encore. -awakeFromNib peut être le meilleur choix. Voir la documentation pour -awakeFromNib. – Giao

+0

Giao, si vous aviez fait une réponse et pas seulement un commentaire, je l'aurais marqué comme la réponse acceptée :) Je pense que l'utilisation de awakeFromNib s'est débarrassé de quelques problèmes dans un cas. – Nimrod

+0

Il n'a pas vraiment résolu votre problème. Il a juste perdu beaucoup de lumière. – Giao

Répondre

2
+0

Merci. J'espérais que quelqu'un pourrait en savoir plus sur ce que les problèmes pourraient être en faisant chacun. Savez-vous s'il y a de bons documents ou des discussions qui expliquent en quelque sorte les problèmes liés à l'initialisation par opposition à l'archivage? Je veux dire que le problème de base est que les objets archivés sont déjà initialisés et ne devraient donc pas être réinitialisés à partir de rien car cela irait normalement à l'encontre de l'objectif de l'archivage. Qu'en est-il des fichiers non-nib? Existe-t-il un AwakeFromDecoding plus générique ou quelque chose? Ou est en train de surcharger initWithCoder simplement cela? – Nimrod

+0

La documentation Apple est un excellent point de départ, bien que parfois un peu laconique. Parfois, ne pas savoir ce que vous cherchez peut être un problème. http://bit.ly/9iPNgb initWithCoder est destiné à l'initialisation pendant le décodage. Notez que dans ce remplacement, les sorties et les actions ne sont pas forcément connectées, mais avec awakeFromNib elles le sont. Un bon point de départ pour la programmation Cocoa est "Cocoa Programming pour Mac OS X" d'Aaron Hillegass. Il couvre ce sujet et beaucoup d'autres. Aussi c'est un mec sympa. Si vous pouvez vous le permettre, ou convaincre votre employeur, ses cours à Big Nerd Ranch sont excellents. – Mark

1

Je fais exactement la même chose, sauf que je suis paresseux et ma méthode est habituellement appelée -didInit.