2011-08-08 4 views
1

J'ai créé une hiérarchie de vue personnalisée dans un XIB que je veux placer sur la vue de divers autres contrôleurs de vues. Les indications de SO indiquent que je dois ajouter explicitement en tant que sous-vue. Le XIB charge et l'affiche dans le débogueur, il semble correct, cependant, il y a deux problèmes. Tout d'abord, il ne définit que l'UIView de niveau supérieur de mon XIB personnalisé et cela ne s'affiche pas. J'ai volontairement mis un fond de couleur différente pour le rendre évident. Le code pour le parent « OtherViewController » qui tente de charger ce point de vue personnalisé comme son en-tête est la suivante:L'affichage personnalisé de l'iPhone SDK chargé depuis XIB ne s'affiche pas?

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    NSLog(@"%s", __FUNCTION__ ); 
    if (self) { 
     // Custom initialization 
     appDelegate = (myProjectAppDelegate*) [[UIApplication sharedApplication] delegate]; 

     NSObject *obj = [[NSBundle mainBundle] loadNibNamed:@"PageHeaderView" owner:self options:nil]; 
     NSArray *array = nil; 

     if ([obj isKindOfClass:[NSArray class]]) { 

      array = (NSArray*) obj; 

      for (UIView *customView in array) { 
       NSLog(@"%@", customView); 
       if ((customView.tag == 3700) && ([customView isKindOfClass:[PageHeaderView class]])) { 
        [self setCustomPageHeaderView: (PageHeaderView*) customView]; 
        [self.view addSubview: customPageHeaderView]; 
        [self.view bringSubviewToFront: customView]; 
       } 

       NSArray *array = [self.customPageHeaderView subviews]; 
       for (NSObject *obj in array) { 
        NSLog(@"%s: \t%@", __FUNCTION__, obj); 
       } 
      } 
     } else { 
      NSLog(@"%s: object following loadNibNamed is [%@]", __FUNCTION__, [obj class]); 
     } 

    } 

    return self; 
} 

Le TAG = 3700 était à nouveau d'avoir un peu évident de l'information dans le débogueur. Il apparaît dans la vue personnalisée comme prévu.

+0

BTW - la hiérarchie des sous-vues apparaît dans le débogueur (j'ai dû être aveugle ou j'ai corrigé accidentellement quelque chose au moment où j'ai posté ce code et cette question). Je ne peux pas déterminer si ce sont des enfants ou des orphelins. – mobibob

+0

Salut à tous - Je l'ai eu tellement de travail ... J'ai ajouté une clause else pour toutes les autres vues dans le tableau pour être sous-vues et cela fonctionne. Je ne peux pas répondre à la question pendant 24 heures, alors si quelqu'un d'autre veut être le héros, j'attribuerai la réponse. ....} else { [self.view addSubview: customView]; [self.view bringSubviewToFront: customView]; } – mobibob

+0

incorrect à nouveau - il n'y avait qu'une seule vue personnalisée avec sa hiérarchie et la boucle sur "sous-vues" ont ensuite été utilisés pour raccorder les propriétés de vue de champ de texte de délégué de mon VC. – mobibob

Répondre

3

Lorsque vous accédez pour la première fois à la propriété self.view, le contrôleur de vue charge sa vue en appelant loadView, qui charge par défaut la vue à partir d'une NIB. En accédant à self.view dans votre méthode initWithNibName:bundle:, vous demandez au contrôleur de vue de charger sa vue avant même que le contrôleur ait terminé l'initialisation.

Essayez de déplacer ce code à viewDidLoad:. Cela garantira que self.view a déjà été paresseux au moment où vous y accédez.

+0

Cela a du sens. Mon code fonctionne maintenant dans initWithNibName: bundle:, mais cela peut être une condition de concurrence en attente. Je vais déplacer le code et voir si j'obtiens les mêmes résultats. – mobibob

+0

J'ai déplacé le code à viewDidLoad: puisqu'il fonctionnait déjà, je ne vois aucune différence, mais j'espère avoir un cycle de vie plus stable pour l'application. +1 – mobibob

Questions connexes