Приложение на основе My Storyboard имеет следующую структуру:
NavigationController (NavCa) -> CollectionViewController (VCa) -> присутствует модально -> TabBarController (TabBarC)
TabBarC имеет две вкладки, каждая из которых встроена в собственный NavigationController:
TabBar [0] NavigationController (NavCTab0) -> TableViewController (VC01) -> ViewController (VC02) -> ViewController (VC03)
TabBar [1] NavigationController (NavCTab1) -> ViewController (VC11) -> ViewController (VC12)
МОЯ ПРОБЛЕМА: одно из моих 3D QuickAction должно переходить непосредственно к VC01.
Я действительно проверял через сайт. Тема Swift: программный переход от одного представления к другому через TabBar и Navigation Controller выглядит очень близко к моему. Я попробовал код (обработчик быстрых действий в AppDelegate.swift):
let mainSB = UIStoryboard(name: "Main", bundle: nil)
let tbc = mainSB.instantiateViewController(withIdentifier: “TabBarC”) as? TabBarController
tbc?.selectedIndex = 0
let ncTab0 = tbc?.viewControllers![0] as! UINavigationController
let vc01 = mainSB.instantiateViewController(withIdentifier: “VC01”) as! TableViewController01
let vc02 = mainSB.instantiateViewController(withIdentifier: “VC02”) as! ViewController02
let vc03 = mainSB.instantiateViewController(withIdentifier: “VC03”) as! ViewController03
let arrayOfVC = [vc01, vc02, vc03]
ncTab0.setViewControllers(arrayOfVC, animated: false)
ncTab0.popToViewController(vc01, animated: true)
self.window?.rootViewController?.present(tbc, animated: true, completion: nil)
но ничего не происходит. В окне вывода ничего не отображается. В приложении ничего не происходит (если приложение было закрыто, оно переходит на экран VCa; если приложение не было закрыто, оно остается на месте до быстрого действия).
Любая помощь высоко ценится.
P.S. Я говорю только по SWIFT.
ИЗМЕНИТЬ
Мой AppDelegate.swift с обработчиком быстрых действий:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
var isLaunchedFromQuickAction = false
// Check if it's launched from Quick Action
if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem {
isLaunchedFromQuickAction = true
_ = handleQuickAction(shortcutItem)
}
// Return false if the app was launched from a shortcut, so performAction... will not be called.
return !isLaunchedFromQuickAction
}
func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
completionHandler(handleQuickAction(shortcutItem))
}
func handleQuickAction(_ shortcutItem: UIApplicationShortcutItem) -> Bool {
var quickActionHandled = false
let type = shortcutItem.type.components(separatedBy: ".").last!
if type == "QuickAction1" {
... // Navigating to VC01, see piece of code above
quickActionHandled = true
}
}
return quickActionHandled
}
Тот же обработчик быстрых действий, который я использую в другом своем приложении. Это приложение имеет структуру NavigationController -> ViewController1 -> ViewController2 -> ViewController3. И там также одно из быстрых действий переходит к ViewController2. Работает как часы. Единственное отличие от нового приложения - это структура приложения. Я не могу выиграть навигацию по всем этим TabBarControllers, NavigationControllers и т. Д.
ИЗМЕНИТЬ 2
Как было предложено, я попробовал другой подход к работе с быстрыми действиями из примера кода Apple (https://developer.apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//apple_ref/doc/uid/TP40016545-Intro-DontLinkElementID_2). И ... Теперь это работает. Частично.
Если я закрою приложение, быстрые действия 3D будут работать нормально.
НО. Если я не закрою приложение и отправлю его только в фоновом режиме - быстрые действия не работают, и в консоли я получаю то же старое сообщение: «Предупреждение: попытка представить‹ APP_NAME.TabBarController: 0x1060b1c00> на ‹UINavigationController: 0x106823200>, вид которого не входит в иерархию окон! '.
Любые идеи?
ИЗМЕНИТЬ 3
КОНЕЧНОЕ РЕШЕНИЕ.
3D Quick Action сделано точно так же, как в примере кода Apple ( https://developer.apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//apple_ref/doc/uid/TP40016545-IntromentDontLink_2 / a>) В AppDelegate.swift под переключателем shortCutType
для быстрого действия с переходом к 'VC01'
case ShortcutIdentifier.first.type:
// Handle shortcut 1 (static).
let mainSB = UIStoryboard(name: "Main", bundle: nil)
let tbc = mainSB.instantiateViewController(withIdentifier: "TabBarC") as? TabBarController
self.window?.rootViewController?.dismiss(animated: true, completion: nil)
self.window?.rootViewController?.present(tbc!, animated: true, completion: nil)
handled = true
break
Этот код протестирован и работает.