使用堆栈和导航栏从AppDelegate推送到ViewController

时间:2019-03-11 10:04:45

标签: swift uiviewcontroller push-notification appdelegate

我正在开发消息传递应用程序,但是在实现推送通知行为时遇到了麻烦。

我想要的是,当用户点击通知时,该群组的对话会打开。但是必须有一个导航栏才能返回到联系人列表。

我已经知道如何从通知中提取信息以获取联系人姓名。我正在AppDelegate上的didReceive函数中尝试此操作。

到目前为止,我尝试过的是:

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController
vc.contactName = name as String
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = vc
self.window?.makeKeyandVisible()

这将打开正确的对话并显示消息,但UI元素没有响应(点击文本字段时无法编写,点击按钮时无法导航至图库等),并且也没有导航栏。

因此,在进行了一些研究之后,我尝试了以下方法:

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController
vc.contactName = name as String
let rootViewController = self.window?rootViewController as! UINavigationController
rootViewController. pushViewController(vc, animated: true)

这不起作用。没有错误消息,但屏幕只是白色。

这是我的情节提要: enter image description here 我在侧面菜单中使用SWRevealViewController,消息传递部分具有tabBarController,联系人列表位于2º标签上。

编辑:使用第二种方法,会出现错误。

  

无法将类型'SWRevealViewController的值转换为UINavigationController'

1 个答案:

答案 0 :(得分:0)

无法将类型'SWRevealViewController的值转换为UINavigationController'

此问题是因为“ SWRevealViewController”不是UINavigationController的子类。因此,您不能以这种方式进行投射。

要解决聊天ViewController问题,您应该像这样修改代码。

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController
let nav = vc.navigationController
vc.contactName = name as String
let rootViewController = self.window?rootViewController as! UIViewController
rootViewController.presentViewController(nav, animated: true, completion: nil)

但是聊天VC将处于演示者模式。您应该处理撤职。

您只需尝试一下,让我知道它是否有效。