如何呈现嵌入在 UITabBarController 和 UINavigationBarController 中的 ViewController

Posted

技术标签:

【中文标题】如何呈现嵌入在 UITabBarController 和 UINavigationBarController 中的 ViewController【英文标题】:How to presentViewController embedded in UITabBarController and UINavigationBarController 【发布时间】:2016-01-28 15:51:54 【问题描述】:

当从主屏幕使用 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
        
    

使用此代码,快捷方式仅将应用程序打开到初始视图控制器,而不是打开到位于不同选项卡中的 helloVCgoodbyeVC 控制器。

我假设这是因为我尝试加载的 ViewControllers 嵌入在 UINavigationController 中以及嵌入在 UITabBarController 中。

我怎样才能 presentViewController 嵌入在 UITabBarControllerUINavigationController 中?

更新

我不确定以下是否有效,因为我的 atm 没有 iPhone 6S。但我已将代码更改为以下代码,希望这将在执行 3D 触摸操作时加载选定的选项卡索引。从那里它应该向视图控制器发布通知以执行转场。

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) 被调用了吗? 您是否研究过所谓的“协调员”模式?这是在移动应用程序中封装导航的一种有用方式。 iamsim.me/the-coordinator-pattern 【参考方案1】:

请尝试以下代码。我认为您没有到达标签栏的导航控制器。您可以通过以下方式执行此操作: 让 insideNvc = tvc?.selectedViewController 作为? 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
    

【讨论】:

以上是关于如何呈现嵌入在 UITabBarController 和 UINavigationBarController 中的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何以模态方式呈现 VC,然后转到嵌入在导航控制器中的 VC

如何使用嵌入模式的express在猫鼬中传递多个复杂查询以将其呈现为我的ejs文件

尝试在控制器之间传递信息失败,但可以从 AppDelegate 到控制器

base64 嵌入式 PDF 文件不会在 Chrome 中呈现

为变量导入文件不呈现嵌入

在 indexpath.item 以编程方式呈现 UIViewController(嵌入在 UITabBarController 中)