ios:在导航控制器中管理一些viewcontroller

时间:2013-11-27 17:27:03

标签: ios objective-c uiviewcontroller uinavigationcontroller

在我的应用程序中,我需要管理导航控制器并在这些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

为什么呢?你能救我吗?

2 个答案:

答案 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];

堆叠:secondViewControllerfirstViewController

[navController addChildViewController:thirdViewController];

堆叠:thirdViewControllersecondViewControllerfirstViewController

你可以在这里看到模式。换句话说,显示fourthViewController是因为它位于堆栈的顶部。

第二个问题

至于您的第二个问题,您无法将视图控制器推送到堆栈中已存在的堆栈。当你考虑到这个事实时,[[self navigationController] pushViewController:self.navigationController.viewControllers[0] animated:NO];似乎很荒谬。你正试图将一些东西从堆栈中推送到堆栈。