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/… 抱歉,这就是我的意思 啊,好的,谢谢。如果您不介意我问,我确实还有另一个问题:如果我随后回复通知,我最终会在控制台中收到一条消息“对以上是关于iOS 以编程方式向下钻取导航堆栈的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式从 ARC 中的导航堆栈中删除 viewController