iPhone - 更换导航控制器中的根视图

43

我有一个包含NavigationController的项目,其中IB中包含要显示的第一个ViewController。这只是创建项目时的默认模式。

在第一个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];
}

但是这并不起作用,第一个视图控制器没有被弹出。第二个视图控制器有一个后退按钮,逻辑上它应该被显示。

我只想将另一个视图替换为导航过程的起点。


1
如果栈顶的视图控制器是根视图控制器,那么 popViewControllerAnimated: 方法将不起作用。换句话说,您无法弹出堆栈上的最后一项。您可以尝试使用 setViewControllers:animated: 方法。 - albertamg
你不能只是在xib中将rootviewcontroller更改为NextViewController吗? - Deeps
3个回答

88

UINavigationController参考文献中:

此方法(popViewControllerAnimated:)将从堆栈中删除顶层视图控制器,并使新的堆栈顶部成为活动视图控制器。如果堆栈顶部的视图控制器是根视图控制器,则此方法不执行任何操作。换句话说,您无法弹出堆栈上的最后一项。

您可以尝试使用setViewControllers:animated:方法代替。

- (void) goNext {

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

15
更现代的版本:UIViewController *cont = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"MySceneId"]; self.navigationController.viewControllers = @[cont]; - wfbarksdale

17

如果堆栈顶部的视图控制器是根视图控制器,则popViewControllerAnimated不会发生任何事情。换句话说,您无法弹出堆栈中的最后一项。

要替换根视图控制器,请使用此方法:

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

2

在Swift中:

self.navigationController?.setViewControllers([detailViewController], animated: true)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接