Swift UISplitview:从appDelegate访问UITabBarController

Swift UISplitview:从appDelegate访问UITabBarController,swift,uitabbar,appdelegate,Swift,Uitabbar,Appdelegate,我需要从appDelegate访问UITabBarController及其第二个子视图 这是我在ApplicationIdentinterBackground中尝试的: let splitViewController = self.window!.rootViewController as! UISplitViewController let leftNavController = splitViewController.viewControllers.first as! UINavigati

我需要从appDelegate访问UITabBarController及其第二个子视图

这是我在ApplicationIdentinterBackground中尝试的:

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为零。如果我从情节提要中删除UINavigation控制器,则可以通过以下方式轻松访问UITabBarController:

let tabController = splitViewController.viewControllers.first as! UITabBarController

如果UISplitView是根,访问UITabBarController的子视图控制器的正确方法是什么?

与其将选项卡栏控制器嵌入导航控制器中,不如将子视图控制器嵌入它们自己的导航控制器中,如下所示:

Split View -> Tab Bar -> Navigation Controller #1 -> View Controller
                      -> Navigation Controller #2 -> View Controller
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)")

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

最后我找到了一个解决方案。我必须像这样使用导航控制器的“ChildViewController”:

Split View -> Tab Bar -> Navigation Controller #1 -> View Controller
                      -> Navigation Controller #2 -> View Controller
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:-)运行它们的方法。

为什么有一个导航控制器后跟一个选项卡栏控制器?你能解释一下你希望你的应用程序的导航是什么样的吗?对不起,我没有显示整个故事板。连接到tabbarcontroller的视图是TableView,它与detailViewController(splitview detailViewController)之间存在连接。如果我删除UINavigationController,DetailView将不再具有带有不同按钮和后退按钮的导航栏。这似乎无法解决问题。好的,我可以访问子视图,但是DetailView现在将不显示“backbutton”。而且,它们看起来是模态的(从底部向上),甚至我将TableView嵌入到NavigationController中。