如何在UITabBarController和UINavigationBarController中呈现嵌入式视图控制器?

7
从主屏幕使用3D Touch快捷方式时,我试图转换到不同的视图控制器。
该应用嵌入在UITabBarController中,每个选项卡根控制器是UINavigationController。
以下是我尝试处理快捷方式以加载每个快捷方式的视图控制器的方法。
private func handleShortcutItem(shortcutItem: UIApplicationShortcutItem) {

    if let rootViewController = window?.rootViewController, let shortcutItemType = ShortcutItemType(shortcutItem: shortcutItem) {
    let sb = UIStoryboard(name: "main", bundle: nil)

        let helloVC = sb.instantiateViewControllerWithIdentifier("HelloVC") as! HelloViewController
        let goodbyeVC = sb.instantiateViewControllerWithIdentifier("GoodbyeVC") as! GoodbyeViewController

        switch shortcutItemType {
        case .Hello:
            rootViewController.presentViewController(helloVC, animated: true, completion: nil)
            break
        case .Goodbye:
            rootViewController.presentViewController(goodbyeVC, animated: true, completion: nil)
            break
        }
    }
}

使用此代码时,快捷方式仅打开应用程序到初始视图控制器,而不是在不同选项卡中的helloVCgoodbyeVC控制器中打开。
我猜测这是因为我要加载的ViewControllers嵌入了一个UINavigationController以及嵌入了UITabBarController中。
如何在UITabBarControllerUINavigationController中嵌入presentViewController
更新:
我不确定以下内容是否有效,因为我现在没有iPhone 6S。但我已将代码更改为以下内容,希望这将在执行3D Touch操作时加载所选的选项卡索引。从那里,它应该向视图控制器发布通知以执行转场。
private func handleShortcutItem(shortcutItem: UIApplicationShortcutItem) {

    if let rootViewController = window?.rootViewController, let shortcutItemType = ShortcutItemType(shortcutItem: shortcutItem) {
      let tababarController = rootViewController as! UITabBarController

        switch shortcutItemType {
        case .Hello:
            tababarController.selectedIndex = 1     
            NSNotificationCenter.defaultCenter().postNotificationName("performsegueHello", object: nil)
            break
        case .Goodbye:
            tababarController.selectedIndex = 4
            NSNotificationCenter.defaultCenter().postNotificationName("performsegueGoodbye", object: nil)
            break
        }
    }
}

你是否检查过是否调用了rootViewController.presentViewController(helloVC, animated: true, completion: nil)或rootViewController.presentViewController(goodbyeVC, animated: true, completion: nil)? - beyowulf
你有了解过被称为“协调器”模式吗?这是一种在移动应用程序中封装导航的有用方式。http://iamsim.me/the-coordinator-pattern/ - Infinity James
1个回答

2
请尝试以下代码。我认为您无法访问选项卡栏的导航控制器。您可以通过以下方式完成: let insideNvc = tvc?.selectedViewController as? UINavigationController 现在,您可以在此处找到导航控制器,并在其上呈现或推送任何内容。
 private func handleShortcutItem(shortcutItem: UIApplicationShortcutItem) {

 let nvc = self.window?.rootViewController as? UINavigationController
 let tvc = nvc?.topViewController as? TabBarController
 let insideNvc = tvc?.selectedViewController as? UINavigationController

if let shortcutItemType = ShortcutItemType(shortcutItem: shortcutItem) {
let sb = UIStoryboard(name: "main", bundle: nil)

    let helloVC = sb.instantiateViewControllerWithIdentifier("HelloVC") as! HelloViewController
    let goodbyeVC = sb.instantiateViewControllerWithIdentifier("GoodbyeVC") as! GoodbyeViewController

    switch shortcutItemType {
    case .Hello:
        insideNvc?.presentViewController(helloVC, animated: true, completion: nil)
        break
    case .Goodbye:
        insideNvc?.presentViewController(goodbyeVC, animated: true, completion: nil)
        break
    }
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接