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

时间:2014-10-04 14:52:02

标签: ios uinavigationcontroller segue uistoryboardsegue drilldown

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

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

Screenshot of view hierarchy

从我上一个问题的回答中,我能够深入到第二视图"但是当我尝试执行segue以推送"第三视图"在堆栈上,我得到了与我之前的问题相同类型的错误:

  

由于未捕获的异常终止应用程序' NSGenericException',原因:'找不到segue' Admin'的导航控制器。 Push segues只能在源控制器由UINavigationController实例管理时使用。'

在我的AppDelegate中,当我收到通知时,我选择了所需的标签:

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

然后在profileViewController(First View)中显示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没有导航控制器(因此崩溃/错误消息)。我不明白这是" First View"嵌入在导航控制器中。

1 个答案:

答案 0 :(得分:1)

你早期执行第三个segue - 第二个segue甚至没有完成,所以它没有navigationController。

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

或使用viewWillAppear!