UISplitview:从 appDelegate 访问 UITabBarController

Posted

技术标签:

【中文标题】UISplitview:从 appDelegate 访问 UITabBarController【英文标题】:UISplitview: access UITabBarController from appDelegate 【发布时间】:2016-02-21 13:35:58 【问题描述】:

我需要从 appDelegate 访问 UITabBarController,以及它的第二个子视图。

这是我在 applicationDidEnterBackground 中尝试过的:

let splitViewController = self.window!.rootViewController as! UISplitViewController
let leftNavController = splitViewController.viewControllers.first as! UINavigationController
let tabController = leftNavController.tabBarController! as UITabBarController
let controllers : Array = tabController.viewControllers!
print("viewcontrollers \(controllers)")

应用程序崩溃,抱怨 tabController 为 nil。如果我从情节提要中删除 UINavigation 控制器,则可以通过以下方式轻松访问 UITabBarController:

let tabController = splitViewController.viewControllers.first as! UITabBarController

访问 UITabBarController 的子控制器的正确方法是什么,其中 UISplitView 是根?

【问题讨论】:

为什么你有一个导航控制器后跟一个标签栏控制器?您能解释一下您希望应用的导航是什么样的吗? 对不起,我没有展示整个故事板。连接到 tabbarcontroller 的视图是 tableviews,它有一个 detailViewController (splitview detailviewcontroller)。如果我删除 UINavigationController,详细视图将不再具有带有不同按钮和后退按钮的导航栏。 【参考方案1】:

终于找到了解决办法。我不得不像这样使用导航控制器的“childViewControllers”:

let splitViewController = self.window!.rootViewController as! UISplitViewController
let leftNavController = splitViewController.viewControllers.first as! UINavigationController
let tabController  = leftNavController.childViewControllers.first as! UITabBarController
let viewControllers : Array = tabController.viewControllers!
print("viewControllers \(viewControllers)")

现在我可以轻松访问任何 viewController 并从 appDelegate 运行它们的方法 :-)

【讨论】:

【参考方案2】:

您应该将子视图控制器嵌入到它们自己的导航控制器中,而不是将标签栏控制器嵌入到导航控制器中,如下所示:

Split View -> Tab Bar -> Navigation Controller #1 -> View Controller
                      -> Navigation Controller #2 -> View Controller

这是将标签栏与导航控制器结合使用的正确方法。

【讨论】:

这似乎不能解决问题。好吧,我可以访问子视图,但细节视图现在将出现没有“后退按钮”。而且它们似乎是模态的(从底部出现),即使我将表格视图嵌入到导航控制器中。

以上是关于UISplitview:从 appDelegate 访问 UITabBarController的主要内容,如果未能解决你的问题,请参考以下文章

通用应用程序的 iPad UISplitView 问题

从 UISplitView 呈现全屏模式视图?

UISplitView 方向问题

iOS 13 UISplitView 问题

更改 UISplitView 中的 RootViewController

为 UISplitView 的详细视图获取错误的框架中心