2011-08-08 12 views
1

他のさまざまなビューコントローラのビューに配置するカスタムビュー階層をXIBに作成しました。 SOからのヒントは、明示的にサブビューとして追加する必要があることを示しています。 XIBが読み込まれ、デバッガで表示されますが、正しいように見えますが、2つの問題があります。まず、カスタムXIBのトップレベルのUIViewしか定義されておらず、表示されません。私は意図的に別の色の背景を明示するようにしました。そのヘッダがあるとして、次のようにこのカスタムビューをロードしようとしている親「OtherViewController」のためのコード:iPhone SDKのカスタムビューがXIBから読み込まれていません。

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

タグ= 3700は、デバッガ内の情報の明白なビットを持って再びでした。期待どおりにカスタムビューに表示されます。

+0

BTW - サブビューの階層がデバッガに表示されています(ブラインドになっている必要があります。またはこのコードと質問を投稿した時点で間違って何かを修正しました)。彼らが子供か孤児であるかどうかはわかりません。 – mobibob

+0

こんにちはすべて - 私はそれを仕事に持っています...私はサブビューになるために配列の他のビューのすべてのためのelse節を追加し、それは動作します。私は24時間質問に答えることができないので、他の誰かがヒーローになりたいなら、私は答えを授けます。 ....} else { [self.view addSubview:customView]; [self.view bringSubviewToFront:customView]; } – mobibob

+0

もう一度間違っています - その階層を持つカスタムビューが1つしかなく、 "subviews"のループが私のVCのデリゲートのテキストフィールドビューのプロパティをフックアップするために使用されました。 – mobibob

答えて

3

最初にself.viewプロパティにアクセスすると、ビューコントローラはデフォルトでNIBからビューをロードするloadViewを呼び出してビューをレイジーロードします。 initWithNibName:bundle:メソッド内でself.viewにアクセスすると、コントローラの初期化が完了する前にビューコントローラにビューをロードするよう要求されます。

このコードをviewDidLoad:に移動してみてください。これにより、self.viewがアクセスした時点ですでに遅延ロードされていることが保証されます。

+0

それは理にかなっています。私のコードはinitWithNibName:bundle:の内部で動作していますが、それは起こるのを待っている競合状態かもしれません。コードを移動して、同じ結果が得られるかどうかを確認します。 – mobibob

+0

私はviewDidLoadにコードを移動しました:既に機能していたので、私は違いは見られませんでしたが、うまくいけばアプリケーションのライフサイクルがより安定しています。 +1 – mobibob

関連する問題