Ярлыки, быстрые действия 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)