我正在开发一个应用程序,其中我依次有三个视图控制器,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在转换期间暂时显示。我做错了什么,我需要做些什么才能解决这个问题?
答案 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 ......或者你需要保持这个顺序?