Как открыть Viewcontroller из Appdelegate? - PullRequest
0 голосов
/ 15 февраля 2019

Я использую firebase для отправки сообщения на устройство ios, отлаживаю, получил полезную нагрузку данных в Appdelegate в func

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;

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

когда вы получаете уведомление в делегате didReceiveRemoteNotification, затем вызываете функцию для pushview для nextviewcontroller.

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
    }
}
0 голосов
/ 15 февраля 2019

Вот оно

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 {
            }
        }
    }

Тем не менее, вы столкнулись с любой проблемой, поэтому, пожалуйста, дайте мне знать.

0 голосов
/ 15 февраля 2019

Объявите эту функцию в своем 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")
...