在 setViewControllers 之后导航堆栈为零

Posted

技术标签:

【中文标题】在 setViewControllers 之后导航堆栈为零【英文标题】:Navigation Stack is nil after setViewControllers 【发布时间】:2014-08-18 11:52:44 【问题描述】:

这是我的层次结构:

A - B - C - D (tabs)
|   |   |   |
|   |   |   |
----------------> AddEventViewController (can be called from any tabs)
    |
    |
    |----> SuggestFeedController (can be accessed from B only)

假设我当前在 D 选项卡中,我调用了 AddEventViewController。 在此之后,我想将用户重定向到“SuggestFeedController”,但我想保留层次结构,这意味着按下后退按钮应该重定向到 B 而不是 AddEventViewController 也不是 D。

我尝试做的事情如下:

UITabBarController *tabbarController = ((UITabBarController *)appDelegate.window.rootViewController);
                 [tabbarController setSelectedIndex:1]; // Selecting the B tab

UIStoryboard* storyboard=  appDelegate.window.rootViewController.storyboard;

UICategoryFeedController *cfvC = [storyboard instantiateViewControllerWithIdentifier:@"UICategoryFeedController"]; // Instantiating B view Controller

SuggestFeed *suggestFeed = [storyboard instantiateViewControllerWithIdentifier:@"SuggestFeed"];


NSArray *viewControllers = [[NSArray alloc] initWithObjects:cfvC, suggestFeed, nil]; // Trying to create my own navigation stack, B first, then Suggest Feed


[self.navigationController pushViewController:suggestFeed animated:NO]; // Some guys on internet do the push, even if I don't think it's necessary because it's already in the stack


NSLog(@"nav stack1 : %@", self.navigationController.viewControllers );
/* returns stack1 : (
    "<D: 0xa627990>",
    "<AddEventViewController: 0x108cb7e0>",
    "<SuggestFeed: 0x123735f0>"
) */


[self.navigationController setViewControllers:viewControllers animated:NO];

NSLog(@"nav stack2 : %@", self.navigationController.viewControllers );
/* returns stack2 : (null) */

我做错了吗? (愚蠢的问题)

为什么 stack2 是 nil,而我已经从我的数组中设置了 viewControllers?

如果你能带来一些帮助,在此先感谢:-)

【问题讨论】:

【参考方案1】:

您是否检查过cfvC 不是nil?如果@"UICategoryFeedController" 与情节提要中的标识符不匹配,则可能是这种情况。我问是因为这会使viewControllers 成为一个空数组,这将解释您的日志记录结果。

另一方面,我猜您有一个设置,其中 UITabBarController 中的每个选项卡都包含自己的导航堆栈(即有四个 UINavigationController 实例,设置为选项卡的 viewControllers酒吧控制器)。其次,我假设您的示例中的self 是视图控制器D。这意味着每当你在这个方法中调用self.navigationController,你得到的是标签D中的导航控制器,无论选择哪个标签。要在选项卡 B 中设置视图控制器,您必须在选项卡 B 中获取对导航控制器的引用。如果我的假设是正确的,您可以执行以下操作:

UINavigationController *tabBNavigationController = tabbarController.viewControllers[1];

this 导航控制器上设置您的 viewControllers 数组应该可以解决问题。另外,你是对的,你不想做pushViewController 位。

【讨论】:

cfvC 不是 nil,但您对 4 UINavigationController 的看法是对的,非常感谢! 同样的情况,1 UINavigationController,我的新视图控制器数组不为零:/ @stefandouganhyde,谢谢,我使用自定义 segue 解决了我的问题,并在执行方法中使用 setViewControllers 使用我的动画层次结构更改视图控制器层次结构。它的效果非常好,就像我想要的那样。再次感谢!

以上是关于在 setViewControllers 之后导航堆栈为零的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 setViewController:direction:animated 方法

UITabBar 在第一次 setViewControllers 调用上的状态

Xamarin iOS UIPageViewController SetViewControllers 查看页面之间

[UINavigationController setView] 和 [UINavigationController setViewControllers] 的区别

用另一个导航控制器替换当前导航控制器

UINAvigationController -> setViewControllers 导致崩溃