La façon de penser est qu'un fichier XIB est un objet sérialisé et non une classe. Une instance d'une classe (c'est-à-dire un objet) ne peut pas être sous-classée, à l'exception de certains langages basés sur des prototypes tels que Javascript. Une façon de se moquer de cela est cependant de créer une classe parente de type UIView qui chargera le XIB et l'ajoutera à lui-même (rappelez-vous qu'un XIB contient un NSArray d'éléments visuels).
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"TestView" owner:self options:nil];
UIView* mainView = (UIView*)[nibViews objectAtIndex:0];
self.label.text = @"Parent";
[self addSubview:mainView];
}
return self;
}
L'enfant peut alors simplement remplacer l'initialiser comme
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.label.text = @"Child";
}
return self;
}
Le self.label
est bien sûr reliée à un UILabel dans le fichier XIB via générateur d'interface et connectée à l'exécution par l'argument owner:self
.
Comme l'a dit Ole, il n'y a pas d'héritage. Vous pouvez et devez hériter des contrôleurs qui gèrent les vues partageant la fonctionnalité. – fsaint
En outre, il est possible de créer des xibs pour une vue spécifique (bien que ce ne soit pas aussi facile qu'il devrait l'être). – Sulthan