2010-12-11 6 views
14

J'ai un ViewController.xib en IB, qui a un UITableView. Je veux construire un autre fichier xib, par ex. Il a hérité de ViewController.xib. Le nouveau SearchViewController.xib devrait hériter le UITableView et en plus il devrait avoir un UISearchBar et un UIButton.hérite du fichier xib dans Interface Builder

Est-il possible de créer ce scénario avec Interface Builder?

Répondre

10

Non, il n'y a pas de concept d'héritage parmi les fichiers NIB. Votre seule option est de dupliquer le fichier original et de faire les changements nécessaires dans la copie.

+2

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

+0

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

1

Vous aurez besoin de fichiers .xib distincts ou, utilisez-en un par défaut, puis ajoutez les contrôles (par exemple, SearchViewController, etc.) par programmation dans le code.

0

C'est vraiment un problème qui devrait être pris en compte dans les prochaines versions de xCode. Comme vous devez écrire du code, votre interface doit être héritée dans d'autres classes, ce qui est un cauchemar en cas de modifications ultérieures./coller le fichier xib qui sera aussi un cauchemar car vous devrez les ouvrir tous et appliquer les modifications

1

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.

+1

La meilleure réponse ici, franchement. – BonanzaDriver

4

Vous pouvez utiliser une vue conteneur pour réutiliser un contrôleur de vue particulier. De cette façon, il suffit de créer une fois, ajouter la logique une fois et vous pouvez simplement réutiliser le composant où jamais vous aimez:

enter image description here

Ceci est Apples documentation sur la vue Container, espère que ça aide!

0

Le problème est que la sous-classe appelle initWithNibName avec son nom de classe.

j'irais avec force superclasse pour charger la superclasse toujours, même si xib hérité (assurez-vous que les points sont .h de la classe super)

en remplacement superclasse initWithNib (il sera appelé ainsi que la normale init si vous avez créé vc basé sur xib)

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