2012-02-06 7 views
2

Je développe une application iOS avec le dernier SDK et XCode 4.2. Je veux utiliser un XIB personnalisé dans un UIView personnalisé.UIView personnalisé avec XIB personnalisé: IBOutlets ne fonctionne pas

Mon UIView personnalisé:

@interface CoordinateView : UIView { 
    /** 
    */ 
    ARGeoCoordinate *geoCoordinate; 
    /** 
    */ 
    IBOutlet UILabel* title; 
    /** 
    */ 
    IBOutlet UILabel* subTitle; 
    /** 
    */ 
    IBOutlet UIImageView* image; 
} 

Mise en œuvre:

@implementation CoordinateView 

@synthesize geoCoordinate; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     // Initialization code. 
     // 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CoordinateView" owner:nil options:nil]; 
     for(id currentObject in topLevelObjects) 
     { 
      if ([currentObject isKindOfClass:[CoordinateView class]]) 
      { 
       [self addSubview:currentObject]; 
       break; 
      } 
     } 
    } 
    return self; 
} 

- (id)initForCoordinate:(ARGeoCoordinate *)coordinate 
{ 
    self.geoCoordinate = coordinate; 
    CGRect theFrame = CGRectMake(0, 0, BOX_WIDTH, BOX_HEIGHT); 

    self = [self initWithFrame:theFrame]; 
    if (self) 
    { 
     title.text = geoCoordinate.title; 
     image.image = [UIImage imageNamed:[NSString stringWithFormat:@"03%d.jpg", geoCoordinate.id]]; 
    } 
    return self; 
} 

Pour initialiser CoordinateView j'utiliser la méthode initWithCoordinate.

Debugging J'ai trouvé que title est nul ici à l'intérieur initWithCoordinate:

title.text = geoCoordinate.title; 

Je l'ai utilisé Interface Builder pour IBOutlets 'lien'.

Qu'est-ce que je fais mal?

Répondre

2

J'ai rencontré le même problème il y a un certain temps. Voici ce que j'ai fait pour le réparer:

  1. Dans le fichier xib, ouvrez le contour du document (le volet de gauche qui affiche la liste des vues et leurs sous-vues, etc.).
  2. Ctrl gauche Cliquez sur la vue représentant votre classe (dans votre cas CoordinateView) et faites glisser la ligne bleue jusqu'aux sous-vues (dans votre cas, le titre appelé UILabel)
  3. XCode devrait alors afficher une petite boîte de dialogue avec le option "title" (parce que votre étiquette est appelée titre.)
  4. Cliquez sur le titre et wallaa.
  5. Revenez à votre débogage et vérifiez si vos prises sont toujours nulles.

Juste une préférence personnelle (pas nécessairement lié au sujet de la discussion): Je voudrais attirer votre UILabel « TitleLabel » au lieu de « title » parce que [titre ObjectInstance] dirait qu'il retournerait un NSString à quelqu'un qui fait Je ne sais pas que 'title' est un UILabel. Juste une préférence personnelle, c'est tout.

Vive

+0

Le problème existe toujours avec XCode 9 et iOS 11, mais pas la boîte de dialogue à l'étape 3. Pourriez-vous s'il vous plaît mettre à jour votre réponse? – iOSdev

-2

Lorsque la vue est totalement chargée, la méthode viewDidLoad est appelée. Donc, vous devez initialiser les éléments dans la vue là:

- (void)viewDidLoad { 
    title.text = self.geoCoordinate.title; 
} 

Plus d'informations dans le docs.

+2

viewDidLoad est une méthode UIViewController, et je ne suis pas en utilisant UIViewControllers. – VansFannel

+0

Comment avez-vous chargé votre fichier xib sans UIViewController? –

+0

@Rollin_s Regardez ma question, le code est là. – VansFannel

1

Dans votre méthode initWithFrame:, vous devez affecter self à currentObject au lieu de l'ajouter en tant que sous-vue.

De même, il n'est pas nécessaire de remplacer initWithFrame: et d'appeler la méthode super car la disposition de votre vue est déterminée par votre fichier xib.

+0

Dans mon projet j'avais fait ce que vous suggérez et tout a fonctionné parfaitement, jusqu'au moment où j'ai dû ajouter un NSMutableArray comme propriété pour ma sous-classe UIView (appelons-le MyCustomView). J'ai alloué et initialisé le tableau dans les méthodes d'initialisation MyCustomView. Mais d'une façon ou d'une autre pendant que l'application fonctionne, le tableau deviendrait mystérieusement nul. J'ai essayé de l'ajouter en tant qu'iVar mais le même problème a persisté. J'ai ensuite googlé et trouvé la méthode d'ajout de la vue chargée avec loadNibNamed à self (self étant une instance de MyCustomView). Cela a fonctionné d'une certaine manière. Des idées sur ce que je faisais de mal? – pnizzle

Questions connexes