如何从Apple模拟“笔记”并使用带有“后退”视图的导航控制器启动应用程序?

时间:2013-11-04 14:08:24

标签: ios objective-c uinavigationcontroller

我有一个具有登录页面的应用程序。然后它移动到导航控制器,该控制器具有集合视图作为其根视图控制器。当应用程序启动并且集合中只有一个项目时,我希望导航控制器自动推送到该项目并允许用户使用“返回”来查看集合。这与Apple的'Notes'中的行为相同。

这个想法是允许用户立即开始使用该应用程序,并且在使用该应用程序一段时间后才“发现”对集合视图的需求。

我正在使用IB,故事板和segues进行视图转换。

如果我以编程方式让根视图控制器在其viewWillLoad中执行performSegue:在转换仍在进行过程中,我收到有关导致转换的错误。

如果我将调用performSegue的代码移动到didLoad中,那么用户将看到双重转换。

2 个答案:

答案 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似乎是操纵堆栈的最佳方式。