2011-08-08 114 views
1

我在XIB中创建了一个自定义视图层次结构,我希望将其放在各种其他视图控制器视图中。 SO的提示表明我必须明确添加为子视图。 XIB在调试器中加载并查看它,它看起来是正确的,但是,有两个问题。首先,它只定义了我的自定义XIB的顶层UIView,并且不显示。我有意将不同的颜色背景放在一个明显的位置。父“OtherViewController”正试图如下作为其标头是加载该自定义视图的代码:从XIB加载的iPhone SDK自定义视图不显示?

- (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; 
} 

的TAG = 3700再次以具有在调试器的信息的明显的比特。它按预期显示在自定义视图中。

+0

顺便说一句 - 子视图的层次结构显示在调试器中(我一定是盲目的,或者在发布代码和问题的时候意外修复了某些东西)。我无法确定他们是否是孩子或孤儿。 – mobibob

+0

嘿所有 - 我知道它的工作原理...我为数组中的所有其他视图添加了一个else子句作为子视图并且它可以工作。我无法回答24小时的问题,所以如果有人想成为英雄,我会给予答案。 ....} else { [self.view addSubview:customView]; [self.view bringSubviewToFront:customView]; } – mobibob

+0

再次出错 - 只有一个自定义视图及其层次结构,然后“子视图”上的循环用于连接VC的委托文本字段视图属性。 – mobibob

回答

3

当您第一次访问self.view属性时,视图控制器通过调用loadView来延迟其视图,默认情况下会从NIB加载视图。通过在您的initWithNibName:bundle:方法中访问self.view,您要求视图控制器在控制器完成初始化之前加载其视图。请致电viewDidLoad:。这将保证您访问它时已经延迟加载了self.view

+0

这很有道理。我的代码现在在initWithNibName:bundle:内部工作,但这可能是等待发生的竞争条件。我将移动代码并查看是否得到相同的结果。 – mobibob

+0

我将代码移到了viewDidLoad中:因为它已经在工作,我没有看到任何区别,但希望我的应用程序的生命周期更稳定。 +1 – mobibob