如何直接通过点击通知警报打开隐藏在视图层次结构中的视图控制器

Posted

技术标签:

【中文标题】如何直接通过点击通知警报打开隐藏在视图层次结构中的视图控制器【英文标题】:How do I open a view controller that is buried deep into the view hierarchy, directly from tap of a Notification alert 【发布时间】:2014-08-21 14:48:54 【问题描述】:

这是我面临的问题:

我有一个 UITabBarController 作为根视图控制器。它管理 4 个视图控制器 - A、B、C、D。 C 是一个导航控制器,在视图层次结构中有 C1 和 C2 视图控制器。

目标是当用户点击通知中心的通知时打开 C1 视图控制器。

问题 - 当用户点击通知时,我将选项卡 selectedIndex 更改为 2(对于 C),这会加载视图 C。在 C 的 ViewDidAppear 中,我推送到 C1。 这种方法的问题在于,用户在转换到 C1 之前会暂时看到视图 C(因为我正在 C 的 viewDidAppear 中进行转换)。我无法在 C 的 viewDidLoad 或 viewWillAppear 中进行此转换,因为运行时会引发不一致的错误。

如果我采用另一种方法,直接从我的代表推送 C1,则所选选项卡仍然是过去的选项卡。如果我更改选项卡的选定索引,它会再次加载 C。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果外部推送通知要求您在应用程序中重新定位用户,您应该使用远程通知。这个snippit应该有帮助。如果没有,请告诉我您还需要什么。

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

    //parse notification to get intended_index = x;
    self.tab_controller.selectedIndex = intendex_index; 

    [self.tab_controller.selectedViewController.navigationController  popToRootViewControllerAnimated:NO];   //or push. depends on your need  

【讨论】:

感谢您回答我的问题。我什至可以按照您之前的建议进行操作。但并非没有暂时显示我不想要的选定控制器。请提出建议。事实上,您的回答只带我到 C 而不是 C1。要转到 C1,我必须从 C 中推送它,这会使其显示一毫秒。 啊,我现在更明白你的问题了。对于 pushToViewController,如果您将动画设置为 no,这仍然会发生吗? 是的,即使动画设置为 NO 也会发生

以上是关于如何直接通过点击通知警报打开隐藏在视图层次结构中的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

尝试显示其视图不在窗口层次结构警报中

如何在 iOS 中触发通知时打开警报视图?

在 iOS8.3 上显示警报视图时,iOS 键盘通知不必要地触发

通过单击通知下拉菜单中的选项卡打开(警报)对话框

单击视图时如何隐藏警报或关闭警报

如何获取当前活动的 UIEvent?