【发布时间】:2014-12-09 11:23:09
【问题描述】:
我有一个应用程序,您可以在其中对产品进行不同程度的定制。在某些情况下,选项会分成两个视图,而在其他情况下,不需要第一步。
我希望对所有产品一视同仁,并将第一个自定义步骤视图控制器推送到导航控制器堆栈,让该视图控制器决定是否需要此步骤。如果不需要,我希望它对产品应用一些默认选项并立即(在过渡动画之前)跳到第 2 步,同时不允许用户返回到第 2 步。
正常的UINavigationController.viewControllers 堆栈在第 2 步时可能如下所示:
[ListView (root)] -> [CustomizeStep1] -> [CustomizeStep2]
但我希望它将默认值应用于产品并修改视图控制器堆栈,以便:
[ListView (root)] -> [CustomizeStep1]
----- becomes -----
[ListView (root)] -> [CustomizeStep2]
我尝试在CustomizeStep1 视图控制器中使用这样的代码:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (shouldSkipToStep2) {
UINavigationController *navController = self.navigationController;
// Move directly to step 2
UIStoryboard *storyboardLoader = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *customizeStep2VC = [storyboardLoader instantiateViewControllerWithIdentifier:@"customizeStep2"];
// Replace current view contoller
NSMutableArray *viewHierarchy = [NSMutableArray arrayWithArray:navController.viewControllers];
[viewHierarchy removeObject:self];
[viewHierarchy addObject:customizeVC];
// Apply new viewController stack
[navController setViewControllers:viewHierarchy animated:NO];
}
}
如果我在设置后查看导航控制器的 viewControllers 数组,一切看起来都符合预期。
在 iOS 7 中会发生什么
这样做时,UINavigationController 的整个功能都会中断。 CustomizeStep1 视图控制器仍然可以动画,但无法正常工作。点击后退按钮仍会显示CustomizeStep1。尝试与视图控制器交互会使应用程序崩溃。 (不过,如果视图控制器显示时没有滑动过渡,它会按预期工作。)
iOS 8 中发生了什么
CustomizeStep1 视图控制器仍然在动画中,但在过渡结束后它立即捕捉到显示CustomizeStep2。除此之外,它按预期工作。
那么,我的问题是是否有更好的地方添加代码来修改导航控制器上的视图控制器堆栈?
我显然需要等到视图控制器已经添加到导航控制器,否则我无法替换堆栈中的视图控制器。但是,我需要能够取消过渡动画,以便可以在 CustomizeStep2 中设置动画。
如果这是不可能的,我很感激,只是想检查一下是否有人知道解决这个问题的好方法。
编辑:
我希望它如何理想地向用户显示
【问题讨论】:
标签: ios ios7 uiviewcontroller ios8