Как отправить контроллер представления из App Delegate на didReceiveRemoteNotification в Swift? - PullRequest
0 голосов
/ 30 июня 2018

Я не могу найти однозначного ответа на это, и я начинаю бороться. Самое близкое, что я получил на данный момент, это present желаемый контроллер представления, но, очевидно, он отображает его модально, а не с помощью панели вкладок или навигационной панели.

В моей AppDelegate есть функция didReceiveRemoteNotification, чтобы попытаться обработать push-уведомления Firebase. По сути, я хотел бы иметь возможность автоматического перехода к определенному контроллеру представления в моем приложении на основе пары ключ-значение, которую я назначаю на консоли Firebase.

Пока мой делегат приложения выглядит так:

AppDelegate

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

        let info = userInfo as NSDictionary
        let name: String = info.value(forKey: "view-controller") as! String

    switch name {
    case "controller1":
        print("controller1")
        let storyBoard = UIStoryboard.getMainStoryboard().instantiateInitialViewController()
        UIApplication.shared.delegate!.window!!.rootViewController = storyBoard
        DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
            print("Time now reached")
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let controller1VC = storyboard.instantiateViewController(withIdentifier: "controller1VC") as! Controller1VC
            self.window?.rootViewController?.present(controller1VC, animated: true)
        }
    default:
        print("Nothing")
    }

}

// and an extension I have...

extension UIStoryboard {
public class func getMainStoryboard() -> UIStoryboard {
    return UIStoryboard(name: "Main", bundle: nil)
}
}

Итак, как вы можете видеть, я преобразовал name в String, чтобы я мог справиться с этим, затем я переключаю его в зависимости от результата. Он создаст экземпляр начального контроллера представления, который всегда будет MainMenuVC, а затем после 5-секундной задержки (это существует исключительно по причинам тестирования), я хочу, чтобы он перешел к Controller1VC.

Метод AppDelegate или View Controller?

Я на правильных линиях здесь? Или лучше передать результат в MainMenuVC и реализовать некоторую логику, чтобы затем сделать performSegue, который сравнительно прост?

Как боковая панель, я получаю и считываю данные совершенно нормально из Firebase, мне просто нужно получить это, чтобы начать вести себя!

Заранее благодарим вас за любое направление, которое вы можете предложить.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Мне удалось заставить его работать так, как мне нужно, с помощью Sh_Khan и ответа, который я нашел в этой теме: Как я могу показать ViewController в UITabBarController?

Мой начальный контроллер представления - это tabBar, и поэтому для меня это правильный код:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    let info = userInfo as NSDictionary
    let name: String = info.value(forKey: "view-controller") as! String

    switch name {
    case "controller1":
            let storyboard = UIStoryboard.init(name: "Main", bundle: nil)
            let controller1VC = storyboard.instantiateViewController(withIdentifier: "controller1VC") as! Controller1VC
            let tabBar = self.window?.rootViewController as? UITabBarController
            let nav = tabBar?.selectedViewController as? UINavigationController
            nav?.pushViewController(controller1VC, animated: true)
    default:
        print("Nothing")
    }
}

Таким образом, этот код по существу преобразует tabBar в UINavigationController, позволяя pushViewController работать.

Надеюсь, это кому-нибудь еще поможет.

0 голосов
/ 30 июня 2018

В вашем случае я рекомендую сделать rootVC как UINavigationController и сделать это

let storyboard = UIStoryboard(name: "Main", bundle: nil)

let controller1VC = storyboard.instantiateViewController(withIdentifier: "controller1VC") as! Controller1VC

let nav = self.window?.rootViewController as! UINavigationController

nav.pushViewController(controller1VC, animated: true)
...