1

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

MyViewControllerには対応するnibファイルがあります(おそらく私の混乱の一部は、クラスとnibの名前がほぼ同じで、接尾辞.m、.h、および.xibのみが異なることです)。これが最初のプロジェクトでの起動時の最初のビューである場合、インスタンス化されたときにawakeFromNibinitWithCoderの両方が呼び出されます。現在、viewDidLoadのみが呼び出されているようです。

何が/なぜそんな違いがあるのか​​迷ってしまいました!?SOで関連する他のスレッドをいくつか見つけましたが、それでも次のような答えで頭を 悩ませています。 「コントローラー自体がペン先からアーカイブ解除されるとawakeFromNibが呼び出されます。ビューが作成/アーカイブ解除されると、viewDidLoadが呼び出されます。これコントローラのビューが別のペン先ファイルに保存されている場合、区別は特に重要です。」

区別は、正確には、ViewまたはViewControllerのアーカイブが解除されているものに依存しているようです。したがって、ViewControllerがインスタンス化されてプッシュされている場合、viewDidLoadが呼び出されることだけを期待する必要がありますか?一方、ViewControllerにIBOutlet(およびそれを表すオブジェクトVCオブジェクトがNibにドラッグされている)がある場合、initWithCoderとawakeFromNibの両方が呼び出されることを期待できますか?

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

誰かが私をまっすぐにするのを手伝ってくれますか?

4

1 に答える 1

2

区別は、正確には、View または ViewController の何がアーカイブ解除されているかに依存しているようです。したがって、ViewController がインスタンス化されてプッシュされている場合、viewDidLoad が呼び出されることだけを期待する必要がありますか? 一方、ViewController に IBOutlet (および Nib にドラッグされたそれを表すオブジェクト VC オブジェクト) がある場合、initWithCoder と awakeFromNib の両方が呼び出されることを期待できますか?

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

あなたの説明から、私はあなたのコードのどこかに次のようなものを持っています:

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

その場合、NIB は MyViewController をインスタンス化していません。あなたのコードは. そのため-awakeFromNib、呼び出されることはありません。あなたはNIBから目覚めていません。

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

于 2009-07-22T03:47:42.530 に答える