2009-09-25 16 views
8

私は忍耐強く、私はまだココアタッチを学んでいます。他の-viewDidLoadという質問は私の問題とは無関係でしたが、私は検索を行いました。-viewDidLoadはサブクラス化されたUIViewControllerで呼び出されません

FooViewControllerUIViewControllerサブクラスです。 FooViewController.xibのFile's OwnerはFooViewControllerに設定されています。さらに、私はMainを持っており、そのアプリケーション代理人はMyApplicationであり、ファイル所有者はUIApplicationです。私の主なペン先はメインに設定されています。

UIWindow *main; 

-(void)applicationDidFinishLaunching:(UIApplication*)application { 
    [self showFooViewController]; 
    [main makeKeyAndVisible]; 
} 

-(void)showFooViewController { 
    fooViewController = [[FooViewController alloc] init]; 
    if(![[NSBundle mainBundle] loadNibNamed:@"FooViewController" owner:fooViewController options:nil]) { 
     DebugF(@"Failed to load FooViewController"); 
     return; 
    } 

    // Add the view and put it in place 
    UIView *view = [fooViewController view]; 
    CGRect cur = [view frame]; 
    cur.origin = CGPointMake(0.0f, 20.0f); 
    [view setFrame:cur]; 

    [main addSubview:[fooViewController view]]; 
} 

しかし、このメッセージはFooViewControllerに送信されていない:

- (void) viewDidLoad { 
    DebugF(@"Hello!"); 
} 
私はビューを作ることができる午前

は(簡潔にするために切り取らコード)このフローを使用して、画面に表示されます

gdbの出力における無音の合計。

私は、IBのドキュメントビューでインスタンスなどを表示する他のCocoaチュートリアルを見てきましたが、これらのオプションは私の中には表示されません。 NibでfooViewControllerをインスタンス化するはずですか?私は接続が欠けていましたか? FooViewController.xibでは、FileのOwnerビューはNibのビューに接続されています。

私はこれが簡単な解決策であると確信しています。私は間違った経路をさまよっています。ハーフ!

答えて

18

viewDidLoadメソッドが呼び出され loadViewた直後に呼び出すことが予想され、それが誰次第ですされ

loadViewに電話をかけて、viewDidLoadに追加の電話をかけてください。

場合によっては、SDKがこの動作を処理します。サブクラスがUIViewControllerMyViewControllerとします。その後:

  • あなたがloadViewを呼び出す前に、あなたはmyViewController.viewにアクセスする場合は、スーパークラスアクセサがあなたのためにloadViewを呼び出すことが十分にスマートで、その後直ちにviewDidLoad。その結果

、あなたのコードは次のように見える場合:

MyViewController *myViewController = [[MyViewController alloc] init]; 
[superView addSubview:myViewController.view]; // Calls viewDidLoad. 

、その後loadViewviewDidLoadの両方があなたに代わって呼び出されます。

しかし、あなたのコードは次のように見える場合:

MyViewController *myViewController = [[MyViewController alloc] init]; 
[myViewController loadView]; 
[superView addSubview:myViewController.view]; // Doesn't call viewDidLoad. 

そしてviewゲッターは、すでにビューをロードした、そしてそれはあなたも同様viewDidLoadと呼ば想定して見ることができます - それは呼び出すことはありませんどちらか。皮肉なことに、ここでの余分な関数呼び出しは、viewDidLoadの呼び出しを防ぎます。

+4

ドキュメントによると、 "このメソッド[loadView]を直接呼び出すべきではありません"。 –

+0

ありがとう、ピーター - 私はあなたが参照しているものを参照してください。誰かが元のソース(Appleから)を読んでみたい場合は、こちらをご覧ください: http://developer.apple.com/iphone/library/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#// apple_ref/occ/instm/UIViewController/loadView – Tyler

+0

私はまさに同じ問題を抱えていました(直接 'loadView'を呼びます)。 –

3

私は自分の質問に答えましたので、これは将来の人々に役立つかもしれません。 ViewDidLoadには、私の提案する3つのトップグーグルが「viewDidLoadが呼び出されていない」、「viewDidLoadが呼び出されていない」、「viewDidLoadが呼び出されていません」ということがあるので、これは通常の間違いであると想像しています...

​​

へ:

fooViewController = [[FooViewController alloc] initWithNibName:@"FooViewController" bundle:[NSBundle mainBundle]]; 

問題を修正しました。私がココアをどう使っているのかは明らかに間違いです。

私は次のようにバックアップする文書を発見していないが、これは私が実験/経験によって導き出さてきたものである
+1

これは小さなことですが、バンドルにnilを渡すと、メインバンドルが表示されます。 –

+0

残念ながら、後者の呼び出しでは、オプションを指定することができません。つまり、プロキシオブジェクトを使用することはできません。しかし、私はちょうどviewDidLoadを無視し、自分のメソッドを手動で呼び出さなければならないように思えます。 –

4

私はこの同じ問題を2回持ちました。初めて、インターフェイスビルダーの実際のUITableViewにUITableViewControllerのビューを接続するのを忘れました。 2回目、私はawakeFromNibをスーパークラスで呼び出すことを忘れました。

関連する問題