iPhone - 在导航控制器中替换 rootview

Posted

技术标签:

【中文标题】iPhone - 在导航控制器中替换 rootview【英文标题】:iPhone - Replacing rootview in navigation controller 【发布时间】:2011-10-06 17:33:54 【问题描述】:

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

在第一个 viewController 中,我收到了一些发送给 appDelegate 的事件,我希望它用另一个 rootview 替换该 rootview。下一个就不去了。

所以我这样做了:

- (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];

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

我只想将第一个视图替换为另一个视图作为导航过程的开始。

【问题讨论】:

如果栈顶的视图控制器是根视图控制器,popViewControllerAnimated: 方法什么也不做。换句话说,您不能弹出堆栈中的最后一项。你可以试试setViewControllers:animated: 方法。 你不能在 xib 中将你的 rootviewcontroller 更改为 NextViewController 吗? 【参考方案1】:

来自UINavigationController reference:

这个方法 (popViewControllerAnimated:) 从栈中移除顶视图控制器并使得 堆栈的新顶部是活动视图控制器。如果视图 堆栈顶部的控制器是根视图控制器,这个 方法什么都不做。换句话说,你不能弹出最后一个项目 堆栈。

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

- (void) goNext 

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

【讨论】:

更现代的版本:UIViewController *cont = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"MySceneId"];self.navigationController.viewControllers = @[cont];【参考方案2】:

如果栈顶的视图控制器是根视图控制器,popViewControllerAnimated 什么也不做。换句话说,您不能弹出堆栈中的最后一项。

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

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

【讨论】:

【参考方案3】:

在斯威夫特中:

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

【讨论】:

以上是关于iPhone - 在导航控制器中替换 rootview的主要内容,如果未能解决你的问题,请参考以下文章

iPhone dev - 基于导航的应用程序模板中的导航控制器在哪里?

导航栏隐藏在 iPhone sdk 的弹出视图控制器上

iphone导航控制器和表格视图

如何在 iPhone 的 Three20 Thumbs 视图控制器中更改导航栏样式?

如何导航到 iPhone 中的下一个视图控制器

iphone:需要在视图控制器中实现导航控制器,该控制器在选项卡栏中选择选项卡后出现