Comment faire en sorte que mon Nib charge correctement ma sous-classe UIScrollView personnalisée?
-
08-07-2019 - |
Question
J'ai eu un bon UIScrollView dans ma pointe, qui a bien fonctionné. Ensuite, j'ai eu des besoins très spéciaux et UIScrollView sous-classé. Dans ma plume, j'ai changé la classe de l'inspecteur d'identité en sous-classe.
Mais pour une raison quelconque, ma méthode -initWithFrame: n'est jamais appelée lorsque le chargeur de nib construit tous ces objets à partir du nib. En fait, je n'ai rien changé pour le moment dans ma sous-classe. Et la vue par défilement fonctionne bien. Attendez-vous à ce que cela semble être un UIScrollView vierge, même si je disais à la nib que ce devrait être un SpecializedUIScrollView à des fins de test.
Y a-t-il autre chose que je dois prendre en compte lors de la sous-classification d'un UIScrollView tout en utilisant un fichier Nib pour le mettre en perspective?
Mon initialiseur dédié ressemble à ceci:
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
NSLog(@"Hello !!!!!!!!!!!!!");
}
return self;
}
Je ne vois jamais ce message dans la console si j'essaie de le charger à partir de Nib. Bien sûr, si j’alloue et initialise cela par moi-même, cela fonctionne. Mais je ne veux pas positionner ma vue de défilement par programme, si je peux utiliser à la place ce maudit Interface Builder.
La solution
Les objets d'un nib ou xib sont stockés en tant qu'objets sérialisés. Cela peut signifier que vous devez utiliser la méthode awakeFromNib
car les méthodes init ne sont jamais appelées.
Autres conseils
Étendez initWithCoder
, veillez à appeler la super méthode. C’est lors de ce super appel que setFrame
sera appelé sur votre classe.
Vous pouvez ensuite réutiliser votre appel initWithFrame
standard dans initWithCoder
, et le générateur d'interface contrôlera la taille du cadre.
- (id)initWithCoder:(NSCoder *)aDecoder {
[super initWithCoder:aDecoder]; // Required. setFrame will be called during this method.
return [self initWithFrame:[self frame]];
}