iOS 以编程方式向下钻取导航堆栈

Posted

技术标签:

【中文标题】iOS 以编程方式向下钻取导航堆栈【英文标题】:iOS Programatically Drill Down Navigation Stack 【发布时间】:2014-10-04 14:52:02 【问题描述】:

我今天早些时候发布了question,关于对收到推送通知的反应,据此我需要从一个视图向下钻取到另一个视图。这个问题得到了回答,但是我现在已经转移到对推送通知做出反应的另一个要求,我需要深入到导航堆栈中的第三级。

下面是我的视图层次结构的模型,在收到推送通知后,我想深入查看视图标题“第三视图”。

根据我上一个问题的答案,我可以深入到“第二视图”,但是当我尝试执行 segue 以将“第三视图”推送到堆栈时,我得到与根据我之前的问题:

由于未捕获的异常“NSGenericException”而终止应用程序,原因:“找不到用于 segue 'Admin' 的导航控制器。只有当源控制器由 UINavigationController 的实例管理时,才能使用推送 segue。'

在我的 AppDelegate 中,当我收到通知时,我会选择所需的选项卡:

UINavigationController *navController = (UINavigationController*)[_tabBarController selectedViewController];
NHProfileViewController *profileViewController = navController.viewControllers[0];
[profileViewController displayAdminWebViewForPushNotification];

然后在profileViewController(第一个视图)displayAdminWebViewForPushNotification:

_displayAdminForPushNotification = YES;
[self performSegueWithIdentifier:@"Settings" sender:self];

在上图中,“设置”是“第二视图”。

然后在prepareForSegue:

if ([segue.identifier isEqualToString:@"Settings"])

    NHSettingsTableViewController *settingsViewController = segue.destinationViewController;

    if (_displayAdminForPushNotification)
    
        [settingsViewController displayAdmin];
        _displayAdminForPushNotification = NO;
    

到目前为止一切都很好,但是只要我点击 [settingsViewController displayAdmin]:

- (void)displayAdmin

    [self performSegueWithIdentifier:@"Admin" sender:self];

它崩溃了。我已经做了一些调试,此时 settingsViewController 没有导航控制器(因此出现崩溃/错误消息)。这我不明白,因为“第一视图”嵌入在导航控制器中。

【问题讨论】:

【参考方案1】:

您提前执行第三次转场 - 第二次转场甚至没有完成,因此它没有导航控制器。

在segue之后使用此方法执行动作来延迟它:How to execute some code after a segue is done?

或使用 viewWillAppear!

【讨论】:

谢谢大吉丹。我现在可以通过延迟 [self performSegueWithIdentifier:@"Admin" sender:self];在“第二个视图”中,但是我想知道是否有更好的方法来做到这一点,而不是通过延迟(知道第二个 segue 何时完成)?你提到了 didPerformSegue,但是我找不到这个方法? ***.com/questions/18310396/… 抱歉,这就是我的意思 啊,好的,谢谢。如果您不介意我问,我确实还有另一个问题:如果我随后回复通知,我最终会在控制台中收到一条消息“对 的开始/结束外观转换的不平衡调用。”,用户界面一团糟——我现在在堆栈上有两个版本的“第二视图”而不是“第二视图”然后是“第三视图”。有任何想法吗?如果我导航回根视图或停留在“第三视图”,则会发生这种情况。 问题是你执行一个 push segue 而另一个正在等待。您必须等待第一个 segue 完成,然后再触发另一个 segue。为此,请在第二个 VC viewDidAppear 方法中触发您的 Admin segue。 @Nick - 回答您的辅助问题,我会检查您的 App Delegate 方法以查看您在控制器层次结构中的位置 - 如果您检查导航控制器的 topViewController 属性的类,您将能够查看它是第一,第二还是第三并相应地选择您的segue。如果是第三,您可能根本不需要转场 - 只需调用一个方法来传递来自推送通知的信息。

以上是关于iOS 以编程方式向下钻取导航堆栈的主要内容,如果未能解决你的问题,请参考以下文章

自动向下钻取导航层次结构?

以编程方式从 ARC 中的导航堆栈中删除 viewController

仅当从警报调用时,如何向第二个向下钻取View Controller添加按钮?

如何在不使用导航栏的情况下从导航堆栈中弹出控制器

如何强制显示移动 Safari 底部导航栏以编程方式显示?

iOS – 在导航堆栈中显示一个视图控制器