2011-09-11 10 views
5

NavViewController内でUIViewControllerをプログラムで設定したいが、loadViewやviewDidLoadメソッドが呼び出される。 loadViewメソッドへ UIViewControllerのloadViewが呼び出されていない

MyViewController *viewController = [[MyViewController alloc] init]; 
UIView *view = [[UIView alloc] initWithFrame:window.frame]; 
viewController.view = view; 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

私はnavigationbarを参照してくださいアプリを起動

、ないの呼び出し:

これはアプリのデリゲートの私のコードです。私は何が欠けていますか? は、私はあなたが編集ヨナさんのコメントの方に編集した

MyViewController *viewController = [[MyViewController alloc] init]; 
[viewController view]; // doesn't look right? 

UINavgationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 

[window addSubview:[navController view]; 
[window makeKeyAndVisible]; 

view

呼び出した後loadViewメソッドが呼び出されると思ったが、loadViewメソッドがまだ呼び出されません。

答えて

10

UIViewControllerコントローラのviewゲッターが呼び出され、そのビューが現在nilである場合(ペン先からのロードまたは-loadViewを実装することにより)、そのビューを作成します。

表示されているコードでは、ビュープロパティのゲッターは決して呼び出さず、そのセッターのみを呼び出します。

また、あなたのアプリケーションデリゲートからコントローラのビューを割り当てています。 UIViewControllerは、オンデマンドで独自のビューを作成する予定であり、他のクラスから提供されることはありません。この方法では、コントローラがメモリの警告に応答してビューをアンロードして再作成しようとしたときに、後で問題が発生します。あなたのコントローラーにそのビューを作成させ、それを渡すことはしないでください。

+0

2番目の発言について、ビューを割り当てると、2番目と3番目のコード行を意味します。それは理にかなっている。しかし、私はこの場合ゲッタをどのように呼びますか? –

+0

'[viewController view]'はビューのゲッターを起動しますが、直接行う必要はありません。あなたのビューコントローラを追加した 'UINavigationController'は、コントローラのビューをビュー階層に追加するためにある時点でそのゲッターを呼び出します。 View Controllerの実装を共有できますか?あなたは何か他のことが起こっているように思えます。 – Jonah

+0

基本的には、Xcodeの空のUIViewControllerテンプレートですが、init以外には(view)メソッドが呼び出されません。そこに私はこのようなビューをセットアップしようとしました: - (id)init { \t self((self = [super init])){ \t UIView *ビュー= [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds] ]; \t self.view = view; \t [リリースを見る]; \t} return self; } –

2

あなたはこの問題に直面していなかったかもしれませんが、先日私は同じ面倒なトラブルに遭遇しました。loadView、viewDidLoad、viewWillAppearはUIViewControllerで呼び出されません。

私の問題はv。シンプルでしたが、あまり気をつけなければ、やっかいです。代わりに

-(void) loadView 

を書いて、私は書いた:

-(void) loadview 

が、これは何の警告を発生しませんのでご注意ください。 loadViewの "V"と "v"の違いは簡単に見落とすことができます。そして、明らかに、loadViewは呼び出されなかったので、viewDidLoad/viewWillAppearはロードされたビューがない(プログラムでビューを作成していない)ので呼び出されません。

-Anshu

2

注目に値するもう一つの落とし穴は、あなたの実装で一致@propertyなし

@synthesize view; 

を定義する場合、これはあなたのビューコントローラの返却はnilへの呼び出しをもたらすことがあり、無コールloadViewメソッドに渡します。

+1

ああ!これは私を得た。私はクラス内で過度の検索/置換操作のために "@synthesize view"で終わってしまいました。それは実現しませんでした。そして、loadViewがこれ以上呼び出されなかったので、突然私のビューは完全に空白になりました。これは追跡するのが面倒だった。ありがとう! –

関連する問題