我有一个具有登录页面的应用程序。然后它移动到导航控制器,该控制器具有集合视图作为其根视图控制器。当应用程序启动并且集合中只有一个项目时,我希望导航控制器自动推送到该项目并允许用户使用“返回”来查看集合。这与Apple的'Notes'中的行为相同。
这个想法是允许用户立即开始使用该应用程序,并且在使用该应用程序一段时间后才“发现”对集合视图的需求。
我正在使用IB,故事板和segues进行视图转换。
如果我以编程方式让根视图控制器在其viewWillLoad中执行performSegue:在转换仍在进行过程中,我收到有关导致转换的错误。
如果我将调用performSegue的代码移动到didLoad中,那么用户将看到双重转换。
答案 0 :(得分:0)
导航控制器通常管理底层堆栈本身。也就是说,您将初始视图控制器传递给它,然后通过segues或pushViewController:animated:
更改堆栈。但是,没有什么可以阻止您手动更改堆栈。在prepareForSegue:sender:
中,您可以检查项目数量,如果是1,请执行以下操作:
UIViewController *singleItemViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SingleItem"];
NSMutableArray *viewControllers = [sender.destinationViewController.viewControllers mutableCopy];
[viewControllers addObject:singleItemViewController];
sender.destinationViewController.viewControllers = viewControllers;
现在不是从堆栈的第一个视图控制器开始,而是从第二个视图控制器开始,然后使用后退按钮进行导航。
答案 1 :(得分:0)
实际上,我发现以下内容对我来说效果最好。
if (/* reason to change back list*/) {
UIViewController * rootViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"backViewController"];
NSArray * viewControllers = @[rootViewController, self];
[self.navigationController setViewControllers:viewControllers animated:NO];
}
setViewControllers似乎是操纵堆栈的最佳方式。