我正在尝试从推送通知中打开某个视图,但我一直在丢失导航栏以及返回和下一个引用。这就是我的故事板的样子(我要打开的视图)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
答案 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)
您可以从情节提要板进行设置->添加视图控制器->嵌入导航控制器中->设置第二个视图控制器->在该控制器之间附加顺序。您将看到与该图像相同的视图控制器。