2010-11-01 13 views
20

Je voudrais créer un couple de vues personnalisées, sorte de composants UI réutilisables, et je préférerais ne pas mettre en forme l'interface utilisateur dans le code de la sous-classe UIView. Je voudrais utiliser un xib pour ça. J'ai utilisé un xib par lui-même. Et j'ai utilisé une sous-classe UIView par elle-même. Mais je ne les ai pas utilisés ensemble. Comment les "attacher" les uns aux autres? J'aimerais utiliser IBOutlets pour accéder aux UILabels dans ma vue personnalisée.Comment utiliser un xib et une sous-classe UIView ensemble?

Est-ce que ce genre de chose fonctionnera?

NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil]; 
MyCustomView *view = [xib objectAtIndex:0]; 
view.myLabel.text = @"fred"; 
+2

Voir http://stackoverflow.com/a/5056886/385619 – Willster

Répondre

14

Oui, c'est la façon dont il fonctionne lorsque vous chargez xibs qui ne sont pas les parents à viewControllers

Modifier 15 Août, 2013:

Vous ne pouvez toujours supposer que vous Vous obtiendrez exactement ce que vous recherchez en dehors de l'index 0 du NSArray retourné, ce qui rend l'utilisation de la vérification de type très utile.

NSArray *xibArray = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:nil options:nil]; 
MyCustomView *myView = nil; 
for (id xibObject in xibArray) { 
//Loop through array, check for the object we're interested in. 
    if ([xibObject isKindOfClass:[MyCustomView class]]) { 
     //Use casting to cast (id) to (MyCustomView *) 
     myView = (MyCustomView *)xibObject; 
    } 
} 
+2

J'ai eu que cela fonctionne comme je le voulais. J'ai créé la sous-classe UIView, ajouté les IBOutlets pour les deux UILabels que j'ai. Dans Interface Builder, j'ai changé la classe de vue en sous-classe UIView et j'ai défini les prises de référence de mes deux étiquettes sur la vue. – Ron

+0

J'essaie de faire la même chose - Savez-vous quel nom de classe je devrais utiliser pour (a) parent UIControllerView et (b) le UIView personnalisé lui-même ici? J'ai noté dans mon code que j'ai mon nom de classe UIView personnalisé dans les deux mais cela me donne un appel récursif à ma méthode d'init UIView personnalisée. C'est-à-dire que j'ai (a) dans le parent UIControllerView qui utilise ma vue personnalisée, dans IB pour son XIB j'utilise un UIView que j'ai mis le classname à "clockview", mais alors (b) dans mon UIView customview clockview réel (pas UIControllerView) Fichier XIB J'ai fait la même chose et j'ai défini le nom de la classe comme étant "clockview". – Greg

+0

Cela prend trop de temps! un autre truc? – Krish