2011-08-08 202 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