0

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

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

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

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

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

4

2 回答 2

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;

现在不是从堆栈的第一个视图控制器开始,而是从第二个视图控制器开始,使用后退按钮导航回来。

于 2013-11-04T14:40:10.197 回答
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 似乎是操作堆栈的最佳方式。

于 2013-11-18T02:07:36.647 回答