如何从 Appdelegate 打开 Viewcontroller?

Posted

技术标签:

【中文标题】如何从 Appdelegate 打开 Viewcontroller?【英文标题】:How to open Viewcontroller from Appdelegate? 【发布时间】:2019-02-15 04:30:35 【问题描述】:

我使用firebase向ios设备发送消息,我调试,我在func的Appdelegate中收到了数据有效负载

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) 
    if let messageID = userInfo[gcmMessageIDKey] 
        print("Message ID: \(messageID)")
    

我想做如何根据那个数据打开不同的视图控制器,也就是说当我点击消息时,我会去对应的视图控制器。 我在 Appdelegate 中使用了下面的代码但失败了

    let sb = UIStoryboard(name: "Main", bundle: nil)
    let otherVC = sb.instantiateViewController(withIdentifier: "UserNotLoginViewController") as! UserNotLoginViewController
    self.window?.rootViewController = otherVC;

【问题讨论】:

检查您的 otherVC 对象以及它不应该为 nil 的窗口对象!哇,你是在调用 show VC code 吗? 如果 nil 则应用程序将崩溃,但我的应用程序只是没有打开不同的 Viewcontrollers nil 并不意味着应用程序总是会崩溃! 【参考方案1】:

当您在 didReceiveRemoteNotification 委托中收到通知时,然后调用该函数将视图推送到下一个视图控制器。

func application(_ application: UIApplication, didReceiveRemoteNotification 
  data: [AnyHashable : Any]) 
    let state: UIApplicationState = UIApplication.shared.applicationState
    if state == .background 
        // background
        pushToPage(data: data)
    


   func pushToPage(data:[AnyHashable : Any])
     if  let appDelegate =  UIApplication.shared.delegate as? AppDelegate,
      let window = appDelegate.window 
      let storyBoard : UIStoryboard = UIStoryboard(name: "Main",  bundle:nil)
      let nextViewController = 
         storyBoard.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
       window.rootViewController = nextViewController
    

【讨论】:

我尝试了你的方法,但除了默认的 Viewcontroller 之外,仍然没有打开不同的 Viewcontroller 当您点击通知时,此调用是否为 didreceiveRemoteNotification 委托? 请查看在此链接上创建的演示。我已经使用了本地通知。点击按钮接收通知。收到通知后,从后台删除应用程序。点击通知。它将转到指定屏幕 -drive.google.com/open?id=1HJRcfmytWJKuHbDt4ko-RPmWYaSysNcr【参考方案2】:

在你的 appDelegate 中声明这个函数,然后用它来改变 rootViewController。

 public func makeRootVC(vcName : String) 
    let vc = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: vcName)
    let navigation = UINavigationController(rootViewController: vc)
    navigation.navigationBar.isHidden = true

    self.window?.rootViewController = navigation

用法:

self.makeRootVC("YourViewControllerStoryboardID")

【讨论】:

【参考方案3】:

这里是

func handlePushNotification(userInfo: [String: Any]) 

        guard let notificationType = userInfo["nt"] as? String else 
            return
        

        if notificationType.toInt() == 1 
            self.navigateToViewController1()
         else if notificationType.toInt() == 2 
            self.navigateToViewController2()
        

    

对于导航,你可以使用下面这个函数

fileprivate func navigateToViewController1() 
        if let rootViewController = self.window?.rootViewController as? UINavigationController 

            if let _ = rootViewController.topViewController as? VC1 
                let vc = AppStoryboard.Main.viewController(viewControllerClass: VC3.self)
                rootViewController.pushViewController(vc, animated: true)
            
        
    

    fileprivate func navigateToViewController2() 

        if let rootViewController = self.window?.rootViewController as? UINavigationController 

            if let homeVC = rootViewController.topViewController as? VC2 
            
        
    

不过,您遇到任何问题,请告诉我。

【讨论】:

以上是关于如何从 Appdelegate 打开 Viewcontroller?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AppDelegate 打开特定的选项卡视图

如何从 AppDelegate 打开特定的 ViewController?

如何从appdelegate打开弹出窗口?

如何从 AppDelegate.swift 路由到任何视图控制器

如何将数据从 appdelegate 传递到视图控制器?

如何从appdelegate调用方法[重复]