2010-12-11 19 views
14

Ho un ViewController.xib realizzato in IB, che ha un UITableView. Voglio costruire un altro file xib ad es. SearchViewController.xib, ereditato da ViewController.xib. Il nuovo SearchViewController.xib dovrebbe ereditare lo UITableView e in aggiunta dovrebbe avere un UISearchBar e uno UIButton.eredita file xib in Interface Builder

È possibile creare questo scenario con Interface Builder?

risposta

10

No, non esiste un concetto di ereditarietà tra i file NIB. L'unica opzione è quella di duplicare il file originale e apportare le modifiche necessarie nella copia.

+2

Come ha detto Ole, non c'è eredità. È possibile e dovrebbe ereditare i controller che gestiscono le viste che condividono la funzionalità. – fsaint

+0

Inoltre, è possibile creare xib per una vista specifica (anche se non è così semplice come dovrebbe essere). – Sulthan

1

Avrete bisogno di file .xib separati, oppure usarne uno come predefinito, quindi aggiungere i controlli (ad esempio SearchViewController, ecc.) Al codice nel codice.

0

Si tratta di un problema che dovrebbe essere risolto nelle prossime versioni di xCode. Come è necessario scrivere in codice, l'interfaccia deve essere ereditata in altre classi che è un incubo in caso di modifiche sono necessarie in seguito. Oppure è possibile copiare/incolla il file xib che sarà anche un incubo visto che dovrai aprirli tutti e applicare le modifiche

1

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.

+1

La migliore risposta qui, francamente. – BonanzaDriver

4

È possibile utilizzare una vista Contenitore per riutilizzare un particolare controller di visualizzazione. In questo modo è sufficiente creare una volta, aggiungere la logica una volta e si può semplicemente riutilizzare il componente di cui-mai ti piace:

enter image description here

Questo è Apples documentation sul contenitore Vista, Speranza che aiuta!

0

Il problema è che la sottoclasse chiama initWithNibName con il suo nome di classe.

Vorrei andare con costringendo superclasse per caricare il XI ter superclasse sempre anche se ha ereditato (assicurarsi che le prese siano in .h della classe super)

in Override superclasse initWithNib (si chiamerà così come normale init se hai creato xib based vc)

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:@"NameOfTheSuperClass" bundle:nibBundleOrNil]; 
    if (self) { 
    } 
    return self; 
} 
Problemi correlati