Où initialiser personnalisé UIView, instancié dans Interface Builder?
J'ai une sous-classe de UIView c'est instancié dans un fichier XIB. J'ai besoin de faire quelques initialisation (paramètres de certaines variables et la création d'une sous-vue).
Cependant, je n'ai pas toujours instancier cette vue via Interface Builder. - Je le faire par programmation. Dans les deux cas, l'initialisation doit être la même.
Mon désigné initialiseur est initWithValues:
.
La question est; où dois-je effectuer l'initialisation?
Depuis que j'ai à effectuer dans 2 endroits différents, j'ai pensé que j'ai besoin de revoir dans un autre initialize
de la méthode (ou quelque chose comme ça), et de l'appeler à partir d' initWithValues:
.
Mais lors du chargement de l'IB, à la fois initWithCoder:
et awakeFromNib
sont appelés. De quelle méthode dois-je appeler initialize
? Ou dois-je appeler initWithValues:
de initWithCoder:
et de ne rien faire dans awakeFromNib
?
OriginalL'auteur Rits | 2011-01-02
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
initWithFrame:
lors de l'initialisation de points de vue (car il est désigné initialiseur). Donc, si vous avezinitWithValues:
assurez-vous que vous appelezinitWithFrame:
.Quelque chose comme cela devrait fonctionner pour l'initialisation: 😉
J'allais ajouter une autre explication, mais mplappert la réponse est assez claire. Utilisation
awakeFromNib
si nécessaire.initWithValues:
) à partir deinitWithCoder:
?N'est-il pas "mal", à l'appel de deux initialiseurs de la super-classe? →Non, car un seul d'entre eux va être appelé. Je ne devrais pas appeler le désigné de l'initialiseur de mon sous-classe (initWithValues:) de initWithCoder:? →en partie oui. initWithCoder: attend que vous pour désarchiver l'objet. C'est pourquoi nous appelons [super initWithCoder]; ce faisant, la vue doit être initialisé. Maintenant vous avez seulement besoin d'init autres ivars, quelque chose, je suppose que vous faites à l'intérieur de la méthode initialize.
OriginalL'auteur nacho4d
Ça dépend de ce que vous avez besoin de l'initialiser. Dès que
awakeFromNib
est appelé, de tous les points de vente et à l'action des connexions de votre point de vue sont établies, ce qui n'est pas le cas dansinitWithCoder:
. Donc, si vous avez besoin de s'appuyer sur ces connexions, utilisez awakeFromNib. Sinon, vous pouvez faire en toute sécurité tous vos initialisation dansinitWithCoder:
.OriginalL'auteur mplappert
Malheureusement, les réponses ci-dessus ne tiennent pas compte de ces choses:
- (void) awakeAfterUsingCoder - et le fait qu'il est appelé après que tout est créé par le codeur (une fois pour chaque Xib).
awakeFromNib souffre du même sort, je l'ai remarqué. (La raison pour laquelle j'ai trouvé ce)
De l'initialisation d'un autre problème est que initWithCoder et initWithFrame peut être évitée pour les vues personnalisées. Et si ils sont appelés, le chargement paresseux (mais pas aussi important que sur les vues elles-mêmes), signifie que vous "pourrait" être en mesure de modifier des valeurs. Je crois que j'ai fait dans initWithCoder, mais si vous initialiser des valeurs dans awakeFromNib, elle est annulée au moins une fois.
J'ai été jusqu'à:
Une autre méthode que j'utilise est de simplement appeler l'initialiseur nécessaires, puis d'appeler mon propre classe ou de la super-classe spécifique de l'initialiseur.
Moi aussi, je suis à la recherche d'une source fiable d'une fois, je peux compter. Jusqu'alors, j'espère que mes maux de tête enregistrer la prochaine personne une heure ou deux.
Steve
didMoveToSuperView
est un très bon endroit pour le faire pour la plupart des points de vue - il couvre manuel et la PLUME de l'instanciation de sans de multiples méthodes init. Pas si bon, si vous avez besoin de la vue d'effectuer toute logique avant, c'est sur l'écran, mais si vous voulez faire cela, alors il y a probablement quelque chose de mal...Ouais, c'est vraiment ce que j'ai eu recours à jour, mais même s'il a un défaut. Quand elle est retirée et son superview est nul, on appelle cela aussi. Pas bon pour la réorganisation, alors j'ai ajouté un test pour "si superview "néant" comme l'appelle test. Attention pour que! Merci pour la réponse 😀
Bon point. stackoverflow prouve son utilité une fois de plus!
OriginalL'auteur Stephen J