2009-07-21 4 views
1

私は別の(ビューベースのテンプレート)プロジェクトにまとめたやや複雑なビューを持っています(View ControllerはMainWindow.xibのオレンジ色のアイコンで表されていました)。私はそれをナビゲーションコントローラによって管理される別のプロジェクトに移すことに決めたのは今のところ十分です。これは、UINavigationControllerのかなり簡単なpushViewController:animated:メソッドから呼び出されます。NavControllerでviewControllerを移動しましたが、awakeFromNibとinitWithCoderは起動しません。

MyViewControllerは、対応するnibファイルを(おそらく私の混乱のいくつかは、ほぼ同じよう.M、.H、& .xibが異なっているだけ接尾辞で命名されたクラス&ペン先がある)があります。これが最初のプロジェクトでの起動時の最初のビューだったとき、awakeFromNibinitWithCoderはインスタンス化されたときに呼び出されます。今すぐにのviewDidLoadが呼ばれるようです。

私は何か/なぜそのような違いがあるのか​​混乱していますか?私はS.O.にいくつかのスレッドを見つけました。関連しているが、彼らはまだのような答えを私の頭を悩ま私を残していること:違いは何に依存するように思わ"awakeFromNib is called when the controller itself is unarchived from a nib. viewDidLoad is called when the view is created/unarchived. This distinction is especially important when the controller's view is stored in a separate nib file."

、exacty、ビューまたは のViewControllerアーカイブされていないことです。したがって、ViewControllerがインスタンス化され、プッシュされている場合、私はviewDidLoadが呼び出されることを期待する必要がありますか?一方、私のViewControllerがIBOutlet(およびそれを表すオブジェクトVCオブジェクトを持っていて、それが私のNibにドラッグされている)なら、私はinitWithCoderとawakeFromNibの両方が呼ばれることを期待できますか?

誰かが私を真っ直ぐにしてくれますか?非常に特殊な状況でさまざまなメソッドが任意に呼び出された場合や、確かにそうであるように、これは正確になぜという非常に特殊な状況で呼び出された場合に、これらのビュー/コントローラを再利用するのが難しいようです。 .iはまだいろいろな方法のそれぞれの間の描写を完全に理解していません。

私はまっすぐに気をつけてください。

答えて

2

区別はどのような時に 依存するよう、exacty、 ビューまたはViewControllerをアーカイブされていないことです。だから ViewControllerが インスタンス化され、プッシュされている場合、私は だけ呼び出されるviewDidLoadを期待する必要がありますか? 他方では、私の のViewControllerが呼び出されます、私は initWithCoderとの両方に awakeFromNibを期待することができます( は私のペン先にドラッグされたことと、それを表す オブジェクトVCオブジェクト)IBOutletを持っている場合はどうなりますか?

これはあなたが迷っているところです。 ViewControllerにIBOutletがあるかどうかは関係ありません。 ViewControllerが-awakeFromNIBが呼び出されるかどうかを決定するNIBでインスタンス化されているかどうかです。あなたの説明から

は、私はあなたがこのような何か持ってどこかにあなたのコードでそれを取る:もしそうなら

MyViewController *vc = [[MyViewController alloc] init]; // (or initWithNibName:bundle:) 
[navController pushViewController:vc animated:YES]; 
[vc release]; 

を、その後、NIBはMyViewControllerのインスタンス化されていません。あなたのコードはです。したがって、-awakeFromNibは呼び出されません。あなたはNIBから覚醒していません。

NIBでナビゲーションコントローラを展開することです(リストビューに切り替える、左上のビューモードセットの中央ボタン)。ここにルートView Controllerが表示されます。デフォルトではUIViewControllerです。ルートコントローラをMyViewControllerにしたい場合は、そのクラスを変更する必要があります。その場合は-awakeFromNibコールがあります。これは、このオブジェクトを作成したNIBになるためです。もちろん、コードをインスタンス化してNavControllerに配置するコードを取り除く必要があります。

+0

これは実際に呼び出されています:MyViewController * myViewController = [[MyViewController alloc] initWithNibName:@ "MyViewController" bundle:nil];あなたが言うことは意味をなさないが...それでも私の場合には当てはまるのだろうか? – Meltemi

+0

はい、まったく同じです。上記のコードの最初の行のコメントに注意してください。 initWithNibName:bundle:この場合はinitと同じです。 –

+0

確かに...私は右にスクロールしなかったことを指摘してくれてありがとう.. – Meltemi

関連する問題