2012-01-13 7 views
2

UIViewController.navigationControllernilになる問題にぶつかりました。私は必死にこの問題への回答を見つけようとしています。UIViewController.navigationControllerがnilになる

UINavigationControllerは、アプリケーションデリゲートに設定を取得します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    self.rootViewController = [[RootViewController alloc] initWithNibName:@"RootView" bundle:nil]; 

    UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:self.rootViewController]; 
    [self.window addSubview:navigationController.view]; 

    [self.window makeKeyAndVisible]; 

    return YES; 
} 

RootViewControllerが表示されている場合は、self.navigationControllerメンバーが設定されていると私はそうのように、ナビゲーションバーを非表示にそれを使用することができます:

- (void)viewWillAppear:(BOOL)animated { 
    NSLog(@"self = %@, self.navigationController = %@", self, self.navigationController); 
    [self.navigationController setNavigationBarHidden:YES animated:NO]; 
} 

デバッグ出力には、selfself.navigationControllerの値が表示されます。

ボタンは、このコントローラでクリックすると、selfが同じ値のまま確かしかしself.navigationControllerは今nilです:

​​

私はこの問題に関する質問の数十を見てきましたし、答えは常にそのUIViewControllerですUINavigationControllerの一部ではありません。 viewWillAppearnavigationControllerにアクセスするとうまくいくので、何か他のことが起こっているはずです。あなたは何か指針を持っていますか?必要に応じて、喜んで詳細を提供します。

答えて

1

あなたのコードでは、あなたはnavigationControllerのビューのみを使用していることを示していますが、navControllerのライフがそうでないような魔法の手で扱われるように祈っています。

navigateControllerの明示的な所有者になる必要があります。実際に

、次の行:

[self.window addSubview:navigationController.view]; 

は、ウィンドウのrootViewControllerはnavigationControllerするために何をしたいことであることを示していると思われる:

self.window.rootViewController = navigationController; 

しかし、また、それは、そのアプリケーションのデリゲートと思われますnavigationControllerのオーナーでもあり、実際にはnavigationControllerはあなたのアプリのデリゲートのivarでなければなりません。要するに

、あなたのオブジェクトグラフ(と、それは偶然に余分が手動で行なったし、あなたのバグを修正保持んだろう)

+0

アップルのエンジニアによる詳細な説明!ありがとうございました。私は幸いにあなたの答えを間違いなく正しいものとして受け入れました。 – digitalbreed

0

Nil View Controllerに問題があり、ストーリーボードでアプリデリゲートに正しく接続されていないことがわかりました。

+0

このヒントをありがとう。私はここでストーリーボードを使用していませんが、iOS 4.xをターゲットにする必要があるためです。また、それはnilであるが、navigationControllerのビューコントローラではありません。 – digitalbreed

0

いつものように、ちょっと後に解決策を見つけるために問題を策定すると役立ちます。

私はARCに餌食になりました。一度私はアプリケーションの代理人のUINavigationControllerを保持し、それは正常に働いた。

+0

解決策は機能しますが、なぜそれをしなければならないかという理由があります。 – Julien

2

アプリのデリゲートでこれを試してみてください修正:

[(UINavigationController *)self.window.rootViewController pushViewController:yourViewController animated:NO]; 

rootviewcontrollerが実際にありますデバッグする場合はUINavigationControllerです。これは私のために働く。

関連する問題