web-dev-qa-db-ja.com

iPhone-Navigation Controllerのルートビューを置き換える

IBに表示する最初のViewControllerを含むNavigationControllerを持つプロジェクトがあります。これは、プロジェクトを作成するときのデフォルトのパターンです。

最初のviewControllerで、appDelegateに送信するイベントを受信し、そのルートビューを別のルートビューに置き換えたいと思います。次のものには行かない。

私もです :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    // Override point for customization after application launch.
    // Add the navigation controller's view to the window and display.
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}

- (void) goNext {

    [self.navigationController popViewControllerAnimated:NO];

    NextViewController* nextWindow = [[[NextViewController alloc] initWithNibName:@"NextView" bundle:nil] autorelease];
    [self.navigationController pushViewController:nextWindow animated:NO];
}

しかし、それは機能しません。最初のViewControllerはポップされません。そして、2番目のボタンは論理的に戻るボタンで表示されます。

ナビゲーションプロセスの開始時に、最初のビューを他のビューに置き換えたいだけです。

39
Oliver

INavigationControllerリファレンス から:

このメソッド(popViewControllerAnimated :)は、スタックからトップビューコントローラーを削除し、スタックの新しいトップをアクティブビューコントローラーにします。スタックの一番上にあるView ControllerがルートView Controllerの場合、このメソッドは何もしません。つまり、スタックの最後のアイテムをポップすることはできません。

代わりにsetViewControllers:animated:メソッドを試すことができます。

- (void) goNext {

    NextViewController* nextWindow = [[[NextViewController alloc] initWithNibName:@"NextView" bundle:nil] autorelease];
    [self.navigationController setViewControllers:[NSArray arrayWithObject:detailViewController] animated:YES];
}
83
albertamg

スタックの一番上のView ControllerがルートView Controllerの場合、popViewControllerAnimatedは何もしません。つまり、スタックの最後のアイテムをポップすることはできません。

ルートView Controllerを置き換えるには、次の方法を使用します。

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated
17
Felix