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 - 基于导航的应用程序模板中的导航控制器在哪里?