在iOS中推送视图控制器时,难以绕过堆栈中的视图控制器

时间:2014-11-05 19:57:08

标签: ios uiviewcontroller uinavigationcontroller

我正在开发一个应用程序,其中我依次有三个视图控制器,ViewControllerA,ViewControllerB和ViewControllerC。在某些情况下,我需要用户从ViewControllerA直接转到ViewControllerC,但遗憾的是,在转换到ViewControllerC期间,ViewControllerB会短暂出现在屏幕上,这是我不想要的。

以下是我正在使用的代码:

VCA内部:

ViewControllerB *vcB = [ViewControllerB new];
    ViewControllerC *vcC = [ViewControllerC new];
    vcB.rootViewController = self;
    [self.navigationController pushViewController:vcB animated:NO];
    [self.navigationController pushViewController:vcC animated:YES];

正如我上面提到的,上面的代码发生在ViewControllerA中,我能够访问ViewControllerC,问题是遗憾的是,ViewControllerB在转换期间暂时显示。我做错了什么,我需要做些什么才能解决这个问题?

3 个答案:

答案 0 :(得分:3)

简单。这是一些几乎正确的伪代码

NSMutableArray *vcStack = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[vcStack addObject:vcB];
[vcStack addObject:vcC];
[self.navigationController setViewControllers:vcStack animated:YES];

显然,如果您不想要现有的视图堆栈,您可以将其丢弃并制作自己的数组,但这可能会导致动画出现故障。

查看UINavigationController的文档以获取更多信息: https://developer.apple.com/library/ios/documentation/Uikit/reference/UINavigationController_Class/index.html#//apple_ref/occ/instm/UINavigationController/setViewControllers:animated

答案 1 :(得分:1)

您可以推送vcC,并在vcC完全显示在屏幕上后,悄悄修改堆栈,在vcB之前插入vcA

ViewControllerB *vcB = [ViewControllerB new];
ViewControllerC *vcC = [ViewControllerC new];
[self.navigationController pushViewController:vcC animated:YES];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy];
    NSInteger indexOfC = [viewControllers indexOfObject:vcC];
    [viewControllers insertObject:vcB atIndex:indexOfC];
    [self.navigationController setViewControllers:viewControllers animated:NO];
});

答案 2 :(得分:0)

你需要直接从A跳到C吗?

然后只使用[self.navigationController pushViewController:vcC animated:YES];

也没有必要推B ......或者你需要保持这个顺序?