2016-02-21 10 views
5

Ich muss auf den UITabBarController zugreifen, und die zweite seiner Unteransichten von der AppDelegate.UISplitview: Zugriff auf UITabBarController von appDelegate

Storyboard with UISPlitViewCOntroller as root

Dies ist, was ich in applicationDidEnterBackground versucht:

 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)") 

Die App abstürzt, beschweren, dass tabController null ist. Wenn ich die UINavigation Controller aus Storyboard zu entfernen, wird die UITabBarController zugegriffen leicht mit:

let tabController = splitViewController.viewControllers.first as! UITabBarController 

Was ist der richtige Weg, um den childcontrollers des UITabBarController zuzugreifen, wo ein UISplitView die Wurzel?

+0

Warum Sie ein Navigationscontroller haben, gefolgt durch einen Tab-Bar-Controller? Können Sie erklären, wie die Navigation Ihrer App aussehen soll? –

+0

Es tut mir leid, ich habe nicht das gesamte Storyboard gezeigt. Die Ansichten, die mit dem Tabbar-Controller verbunden sind, sind Tabellenansichten, die einen Abschnitt zu einem DetailViewController (splitview detailviewcontroller) haben. Wenn ich den UINavigationController entferne, haben die Detailansichten nicht mehr die Navigationsleiste mit verschiedenen Schaltflächen und Zurück-Schaltflächen. –

Antwort

4

Endlich fand ich eine Lösung. Ich hatte „childViewControllers“ der Navigation-Controller wie folgt zu verwenden:

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)") 

Jetzt kann ich einfach eine der Viewcontrollers zugreifen und führen ihre Methoden aus AppDelegate :-)

1

Anstatt Ihre Tab-Leiste Controller in einem Navigationscontroller Einbettung, sollten Sie die untergeordnete Ansicht-Controller in ihren eigenen Navigationscontroller, wie dies einbetten:

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

Dies ist der richtige Weg, um eine Tab-Leiste zu verwenden, in Verbindung mit einem Navigationscontroller.

+0

Das scheint das Problem nicht zu lösen. Nun, ich kann auf die Unteransichten zugreifen, aber die Detailansichten erscheinen jetzt ohne einen "Zurück-Knopf". Auch scheinen sie modal zu erscheinen (kommt von unten), sogar ich bette die Tabellenansichten in Navigationscontroller ein. –

+0

Oh, okay. Nun, ich bin froh, dass du dein Problem gelöst hast :) –

Verwandte Themen