使用堆栈和导航栏从 AppDelegate 推送到 ViewController
Push to ViewController from AppDelegate with stack and navigation Bar
我正在开发消息传递应用程序,但在实现推送通知行为时遇到了问题。
我想要的是当用户点击通知时,该组的对话打开。但是必须有一个导航栏才能返回到联系人列表。
我已经知道如何从通知中提取信息以获取联系人姓名。我正在 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)
这行不通。没有错误消息,但屏幕只是白色。
这是我的故事板:
我在侧面菜单中使用 SWRevealViewController,消息传递部分有一个 tabBarController,联系人列表在 2º 选项卡上。
编辑:使用第二种方法,有一个错误。
Could not cast value of type 'SWRevealViewController to UINavigationController'
我认为您应该使用 NotificationCenter 来执行此操作。
当用户点击通知时,您应该 post 在 didReceive 中创建一个 NotificationCenter,如下所示:
NotificationCenter.default.post(name: .onMessageRecieved, object: notificationObject)
并且根据您所在的视图控制器,您应该在 viewDidLoad() 函数中添加一个观察者,以便它理解已收到如下消息:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.onMessageRecieved(notification:)), name: .onMessageRecieved, object: nil)
}
并且您应该在视图控制器中有一个 func (onMessageRecieved) 来执行这样的导航:
func onMessageRecieved(notification: NSNotification){
// open the conversation
let vc = self.storyboard?.instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController
vc.contactName = name as String
self.navigationController?.pushViewController(vc, animated: true)
}
通过这种方式,您可以从视图控制器进行导航,因此导航也将在那里。
无法转换类型 'SWRevealViewController to 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 将处于演示者模式。你应该处理解雇。
你试试这个,让我知道它是否有效。
我正在开发消息传递应用程序,但在实现推送通知行为时遇到了问题。
我想要的是当用户点击通知时,该组的对话打开。但是必须有一个导航栏才能返回到联系人列表。
我已经知道如何从通知中提取信息以获取联系人姓名。我正在 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)
这行不通。没有错误消息,但屏幕只是白色。
这是我的故事板:
编辑:使用第二种方法,有一个错误。
Could not cast value of type 'SWRevealViewController to UINavigationController'
我认为您应该使用 NotificationCenter 来执行此操作。
当用户点击通知时,您应该 post 在 didReceive 中创建一个 NotificationCenter,如下所示:
NotificationCenter.default.post(name: .onMessageRecieved, object: notificationObject)
并且根据您所在的视图控制器,您应该在 viewDidLoad() 函数中添加一个观察者,以便它理解已收到如下消息:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.onMessageRecieved(notification:)), name: .onMessageRecieved, object: nil)
}
并且您应该在视图控制器中有一个 func (onMessageRecieved) 来执行这样的导航:
func onMessageRecieved(notification: NSNotification){
// open the conversation
let vc = self.storyboard?.instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController
vc.contactName = name as String
self.navigationController?.pushViewController(vc, animated: true)
}
通过这种方式,您可以从视图控制器进行导航,因此导航也将在那里。
无法转换类型 'SWRevealViewController to 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 将处于演示者模式。你应该处理解雇。
你试试这个,让我知道它是否有效。