在我的应用程序中,我需要管理导航控制器并在这些viewcontrollers中移动它,所以我这样做
UINavigationController *navController = (UINavigationController*) [self.storyboard instantiateViewControllerWithIdentifier:@"navigationcontroller"];
[navController addChildViewController:firstViewController];
[navController addChildViewController:secondViewController];
[navController addChildViewController:thirdViewController];
[navController addChildViewController:fourthViewController];
[self presentViewController:navController animated:YES completion:nil];
第一个问题:导航打开第一个viewviewcontroller,为什么?
第二个问题:如果是来自secondviewcontroller,我首先要通过它:
[[self navigationController] pushViewController:self.navigationController.viewControllers[0] animated:NO];
我有一个崩溃说:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Pushing the same view controller instance more than once is not supported
为什么呢?你能救我吗?
答案 0 :(得分:1)
第一个问题
每次使用“addChildViewController:”时,新控制器都会添加到堆栈顶部。插入的最后一个, fourthViewController 位于堆栈的顶部,因此在调用方法时会显示
[self presentViewController:navController animated:YES completion:nil];
第二个问题
这取决于 pushViewController:方法本身。在Apple documentation,医生说:
添加的viewController不能是标签栏控制器的实例,必须不在导航堆栈。
你的应用程序崩溃,因为 self.navigationController.viewControllers [0] 已经在导航堆栈上。
答案 1 :(得分:0)
您正在将四个视图控制器推入导航堆栈。因此,在每个步骤之后,您的堆栈看起来像这样:
[navController addChildViewController:firstViewController];
堆叠:firstViewController
[navController addChildViewController:secondViewController];
堆叠:secondViewController
,firstViewController
[navController addChildViewController:thirdViewController];
堆叠:thirdViewController
,secondViewController
,firstViewController
你可以在这里看到模式。换句话说,显示fourthViewController
是因为它位于堆栈的顶部。
至于您的第二个问题,您无法将视图控制器推送到堆栈中已存在的堆栈。当你考虑到这个事实时,[[self navigationController] pushViewController:self.navigationController.viewControllers[0] animated:NO];
似乎很荒谬。你正试图将一些东西从堆栈中推送到堆栈。