使用 UITabbarController 和 UINavigationController 从 storyboard 调用 View

Posted

技术标签:

【中文标题】使用 UITabbarController 和 UINavigationController 从 storyboard 调用 View【英文标题】:Call View from storyboard with UITabbarController and UINavigationController 【发布时间】:2016-09-07 21:23:05 【问题描述】:

我正在尝试为我的 ios 应用实现 3D 快速操作。 我已经设法添加了快速操作并想在我的故事板中打开一个视图控制器。

我的根控制器是一个 UITabbarController。在这里面我有一个 UINavigationController。

我关注了这个tutorial

然后我想在 appdelegate 中打开一个搜索视图,并尝试像教程中那样做。但我只看到黑屏。

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) 
    if shortcutItem.type == "com.traning.addStuff" 
        let sb = UIStoryboard(name: "Main", bundle: nil)
        let searchVC = sb.instantiateViewControllerWithIdentifier("Search") as! SearchView
        let root = UIApplication.sharedApplication().keyWindow?.rootViewController

        root?.presentViewController(searchVC, animated: false, completion:  () -> Void in
            completionHandler(true)
        )


    

我的视图控制器是 UINavigationController 中的第三个视图控制器

[UITab] -> [UINav] -> [UINav] -> [UINav]

我尝试将根视图初始化为 UITabbarController,但如何访问或调用我的视图为 UINavigationController?

有什么建议吗?

谢谢!

编辑:

我添加了一张图片来说明我的故事板(这只是一个示例) 我有一个 UITabBarController -> UINavigationController -> FirstView -> SecondView

使用我想要调用 SecondView 的 3D 快速操作。

【问题讨论】:

建议在演示之前尝试 root?.definesPresentationContext = true。希望有帮助:) @LucianoAlmeida 嘿,谢谢,但它仍然不起作用。我正在接收此日志输出。警告:尝试在视图不在窗口层次结构中的 上显示 既然你有这个日志,你可以这样尝试:let root = UIApplication.sharedApplication().keyWindow?.rootViewController。可见ViewController 代替。希望有效:) @LucianoAlmeida 感谢您的帮助。不幸的是,它仍然不起作用。我真的不知道我做错了什么:/ 【参考方案1】:

对于所有遇到相同问题的人,我在这里找到了解决方案: http://blog.opendatalab.de/hack/2015/10/25/3d-touch-with-tabbarcontroller-and-navigationcontroller

所以这里是我用来调用 secondView 的代码:

if let tabController = self.window?.rootViewController as? UITabBarController 
                tabController.selectedIndex = 1

                let navController = tabController.selectedViewController as? UINavigationController
                navController?.popToRootViewControllerAnimated(false)

                let firstView = navController?.viewControllers[0]
                firstView?.performSegueWithIdentifier("second", sender: nil)                
            

tabController.selectedIndex 取决于您要在其中执行 segue 的 UITabBarController 中的视图项。我的情况是它是 UITabBarController 的第二项。

我希望这会有所帮助。

【讨论】:

以上是关于使用 UITabbarController 和 UINavigationController 从 storyboard 调用 View的主要内容,如果未能解决你的问题,请参考以下文章

UITabBarController的基本原理及使用

UINavigationController和UITabBarController

继承 UITabBarController 和 UINavigationController

一起使用 UITabBarController 和 UINavigationController

UIMoreNavigationController 和 UITabBarController 的问题

使用 UITabBarController 和 UINavigationController 的最佳方式