通过推送通知使用导航控制器打开特定视图

时间:2019-03-20 13:34:57

标签: ios swift push-notification

我正在尝试从推送通知中打开某个视图,但我一直在丢失导航栏以及返回和下一个引用。这就是我的故事板的样子(我要打开的视图)http://tinypic.com/r/xnffhi/9

这是我在AppDelagate中拥有的:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "notification") as? NotificationViewController
            self.window?.rootViewController = vc

3 个答案:

答案 0 :(得分:1)

正如我们在您提供的屏幕快照中看到的那样,应用程序的根视图控制器是UINavigationController实例。

据此,让我提供下一个代码:

func handleNotification(){
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        guard let vc = storyboard.instantiateViewController(withIdentifier: "notification") as? NotificationViewController else{
            debugPrint("NotificationViewController with identifier 'notification' not found")
            return
        }

        guard let navVC = self.window?.rootViewController as? UINavigationController else{
            debugPrint("RootViewController is not an UINavigationController")
            return
        }

        navVC.pushViewController(vc, animated: true) //perhaps your will prefer to use false
    }

除此之外,您可以使用更灵活的实现方式。

在AppDelegate中,当拦截到通知时,发布一个(NS)通知,相关的视图控制器将观察该通知,并在广播通知时采取行动。

您还可以为segue设置一个标识符,并从观察的视图控制器中调用performSegue方法

答案 1 :(得分:1)

您正在做的是完全替换应用程序的根视图控制器,这意味着所有当前UI将被丢弃。

您应该做的是利用您对应用程序的了解,将其定向到新内容。例如,如果您的根视图控制器是导航控制器,则可以将rootViewController投射到导航控制器并将其推入(如果您的根视图控制器是其他东西,例如标签栏控制器,则将失败)。

guard let vc = storyboard.instantiateViewController(withIdentifier: "notification") as? NotificationViewController else {
  fatalError("Main Storyboard doesn't have a notification controller")
}
guard let nav = self.window?.rootViewController as? UINavigationController else {
  return //handle unexpected state
}
nav.push(vc, animated: true)

另一种选择是将通知控制器嵌入导航控制器中,添加一个Close按钮,然后以模态方式显示它,这样,无论该控制器是什么,您都可以将其显示在rootViewController之上是。

答案 2 :(得分:0)

您可以从情节提要板进行设置->添加视图控制器->嵌入导航控制器中->设置第二个视图控制器->在该控制器之间附加顺序。您将看到与该图像相同的视图控制器。