Ярлыки, быстрые действия 3D Touch swift

По какой-то причине у меня возникают проблемы с поиском ярлыков в моем приложении. Я следовал всем урокам и считаю, что все сделал правильно; однако, это действительно странно. Проблема заключается в том, что когда вы полностью закрываете это приложение и запускаете элемент 3D Touch Shortcut на главном экране, он переводит вас в нужную часть приложения, как и должно быть; однако, когда приложение открыто в фоновом режиме (например, вы просто нажимаете кнопку "Домой"), оно не приводит вас к нужной части приложения, оно просто открывает его. Это действительно странно, и я не уверен, что делать, потому что я следовал всем инструкциям. Спасибо вам большое!

Код:

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {

    if shortcutItem.type == "com.myapp.newMessage" {

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


        let vc = sb.instantiateViewController(withIdentifier: "RecentVC") as! UITabBarController
         vc.selectedIndex = 2 //this takes me to the contacts controller



        let root = UIApplication.shared.keyWindow?.rootViewController

        root?.present(vc, animated: false, completion: {
            completionHandler(true)
        })


    } else if shortcutItem.type == "com.myapp.groups" {
        let sb = UIStoryboard(name: "Main", bundle: nil)


        let vc = sb.instantiateViewController(withIdentifier: "RecentVC") as! UITabBarController
        vc.selectedIndex = 1 //this takes me to the groups controller

        let root = UIApplication.shared.keyWindow?.rootViewController

        root?.present(vc, animated: false, completion: {
            completionHandler(true)
        })

    } else {
        //more short cut items I will add later
    }
}

ПРИМЕЧАНИЕ: это статические элементы ярлыка, и я настроил их в файле info.plist. Эта функция, которая была представлена, является единственным местом в приложении, кроме файла info.plist, в котором есть что-то о элементах ярлыка.

РЕДАКТИРОВАТЬ: Это похоже на проблему с RootViewController, потому что я пробовал несколько разных способов сделать это, и он по-прежнему выдает мне то же предупреждение

2017-11-22 22:36:46.473195-0800 QuickChat2.0[3055:1068642] Внимание! Попытайтесь представить, чей вид не находится в иерархии окон!

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

1 ответ

Вы должны установить переменную в вашем performActionForShortcutItem который говорит вам тип ярлыка и переместить код, который у вас там, в applicationDidBecomeActive, Вы могли бы выглядеть так

var shortcut: String?

func applicationDidBecomeActive(application: UIApplication) {
    if let shortcutItem = shortcut {
        shortcut = nil
        if shortcutItem == "com.myapp.newMessage" {
            let sb = UIStoryboard(name: "Main", bundle: nil)
            let vc = sb.instantiateViewController(withIdentifier: "RecentVC") as! UITabBarController
            vc.selectedIndex = 2 //this takes me to the contacts controller
            let root = UIApplication.shared.keyWindow?.rootViewController
            root?.present(vc, animated: false, completion: nil)
        } else if shortcutItem == "com.myapp.groups" {
            let sb = UIStoryboard(name: "Main", bundle: nil)
            let vc = sb.instantiateViewController(withIdentifier: "RecentVC") as! UITabBarController
            vc.selectedIndex = 1 //this takes me to the groups controller
            let root = UIApplication.shared.keyWindow?.rootViewController
            root?.present(vc, animated: false, completion: nil)
        } else {
            //more short cut items I will add later
        }
    }
}

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
    shortcut = shortcutItem.type
    completionHandler(true)
}

Я думаю, что более чистый метод - установить ваши флаги в методе performActionFor, а затем проверить их, когда ваш VC загрузится. Использование этого уведомления будет обрабатывать ярлык каждый раз, когда приложение становится активным, включая запуск.

override func viewDidLoad() {
    super.viewDidLoad()
    // Sends notification if active app is reentered to handle quick actions
    NotificationCenter.default.addObserver(self, selector: #selector(handleQuickActions), name: UIApplication.didBecomeActiveNotification, object: nil)
Другие вопросы по тегам