如何在UITabBarController和UINavigationBarController中嵌入presentViewController

Ril*_*Dev 7 uitabbarcontroller uinavigationcontroller ios presentviewcontroller swift

当我从主屏幕使用3D Touch Shortcuts时,我试图转向不同的视图控制器.

应用程序嵌入在一个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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

与此代码的快捷方式只打开应用程序初始视图控制器和不将helloVCgoodbyeVC其在不同的选项卡控制器.

我认为这是因为ViewControllers我试图加载嵌入在嵌入的内部UINavigationController以及嵌入内部UITabBarController.

我怎么能presentViewController嵌入UITabBarControllerUINavigationController

UPDATE

我不确定以下是否有效,因为我没有iPhone 6S和我一起使用.但我已将代码更改为以下内容,希望这将在执行3D Touch Action时加载选定的选项卡索引.从那里它应该向视图控制器发布通知以执行segue.

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 2

请尝试以下代码。我认为您没有到达选项卡栏的导航控制器。您可以通过以下方式执行此操作:let insideNvc = tvc?.selectedViewController as? UI导航控制器

现在,这是您的导航控制器,您可以在其上呈现或推送任何内容。

 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
    }
}
Run Code Online (Sandbox Code Playgroud)

}