Il modo di pensarci è che un file XIB è un oggetto serializzato e non una classe. Un'istanza di una classe (ad esempio un oggetto) non può essere sottoclassata, tranne che da alcuni linguaggi basati su prototipi come Javascript.
Un modo di deridere ciò è creare una classe genitrice di tipo UIView che caricherà l'XIB e lo aggiungerà a se stesso (ricorda che un XIB contiene un NSArray di elementi visivi).
- (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;
}
il bambino può poi semplicemente ignorare l'initialiser come
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.label.text = @"Child";
}
return self;
}
La self.label
è ovviamente collegato a un UILabel nel file XIB tramite la creazione di interfacce e collegato a runtime tramite l'argomento owner:self
.
fonte
2013-02-22 11:57:54
Come ha detto Ole, non c'è eredità. È possibile e dovrebbe ereditare i controller che gestiscono le viste che condividono la funzionalità. – fsaint
Inoltre, è possibile creare xib per una vista specifica (anche se non è così semplice come dovrebbe essere). – Sulthan