我的基于故事板的应用程序具有以下结构:
NavigationController(NavCa)-> CollectionViewController(VCa)-> present modally -> TabBarController(TabBarC)
TabBarC有两个选项卡,每个选项卡都嵌入到自己的NavigationController中:
TabBar[0] NavigationController(NavCTab0)-> TableViewController(VC01)-> ViewController(VC02)-> ViewController(VC03)
TabBar[1] NavigationController(NavCTab1)-> ViewController(VC11)-> ViewController(VC12)
我的问题:我的一个3D QuickAction必须直接导航到VC 01。
我查过网站了。Swift: Programmatically transitioning from 1 view to another via a TabBar and 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。
编辑
My AppDelegate.swift with Quick Action Handler:
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 --> ViewController 1--> ViewController 2--> ViewController 3。还有一个快速操作导航到ViewController 2。它就像一个魅力。与新应用程序的唯一区别是应用程序结构。我无法通过所有这些TabBarControllers、NavigationControllers等赢得导航。
编辑2
按照建议,我尝试了Apple示例代码(https://developer.apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//apple_ref/doc/uid/TP 40016545-Intro-DontLinkElementID_2)中的另一种快速操作处理方法。而且...它现在起作用了。一部分吧
如果我终止应用程序的3D快速动作工作完美。
但是.如果我不终止应用程序,只在后台发送它-快速操作不工作,在控制台我得到相同的旧消息:'警告:试图显示<APP_NAME.TabBarController: 0x1060b1c00><UINavigationController: 0x106823200>不在窗口层次结构中的视图!'.
有什么想法吗
编辑3
最终解决方案。
3D快速操作完全按照Apple示例代码(https://developer.apple.com/library/content/samplecode/ApplicationShortcuts/Introduction/Intro.html#//apple_ref/doc/uid/TP 40016545-Intro-DontLinkElementID_2)在AppDelegate.swift中的开关shortCutType
下进行快速操作,导航到“VC 01”
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
此代码测试和工作.
1条答案
按热度按时间hec6srdp1#
根据我对你的代码的理解,我认为只有三行代码就足够了
由于标签栏视图控制器似乎只在故事板中设置。默认情况下,选择选项卡栏Controller的第一个选项卡。
编辑
对于“尝试呈现...”问题的其他解决方案,您可以设置标志,并在视图控制器viewDidLoad方法中尝试以与代码中相同的方式呈现tabBarViewController。