2016-02-21 20 views
5

Potrzebuję dostępu do UITabBarController, a drugi z jego subviews z appDelegate.UISplitview: dostęp UITabBarController z appDelegate

Storyboard with UISPlitViewCOntroller as root

To co próbowałem w 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)") 

Aplikacja ulega awarii, twierdząc, że tabController jest zerowa. Jeśli usunąć kontroler UINavigation z ujęć The UITabBarController jest łatwo dostępny z:

let tabController = splitViewController.viewControllers.first as! UITabBarController 

Co to jest poprawny sposób uzyskać dostęp do childcontrollers z UITabBarController, gdzie UISplitView jest korzeniem?

+0

Dlaczego masz kontroler nawigacji po przez kontroler paska kart? Czy możesz wyjaśnić, jak chcesz wyglądać w aplikacji? –

+0

Przykro mi, nie pokazałem całego storyboardu. Widoki połączone z tabbarcontroller są widokami tabeli, które mają segeus do detailViewController (splitview detailviewcontroller). Po usunięciu UINavigationController, widoki szczegółowe nie będą już miały pasek nawigacji z różnymi przyciskami i przycisk Wstecz. –

Odpowiedz

4

W końcu znalazłem rozwiązanie. Musiałem użyć „childViewControllers” z kontrolerem nawigacyjnym takich jak to:

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

Teraz można łatwo uzyskać dostęp do którejkolwiek z viewControllers i uruchomić swoje metody z appDelegate :-)

1

Zamiast umieszczania kontrolera pasek kart w kontrolerze nawigacyjnym należy umieścić kontrolery widoku dziecko w ich własnych kontrolerów nawigacji, podobnie jak to:

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

To jest właściwy sposób korzystać z paska kart w w połączeniu z kontrolerem nawigacyjnym.

+0

To wydaje się nie rozwiązywać problemu. Cóż, mogę uzyskać dostęp do subviews, ale szczegółowe widoki będą teraz wyświetlane bez "przycisku". Również wydają się pojawiać modalnie (pojawia się od dołu), nawet ja osadzam tableviews w navigationcontrollers. –

+0

Oh, okay. Cóż, cieszę się, że rozwiązałeś swój problem :) –

Powiązane problemy