2016-02-21 34 views
5

Ho bisogno di accedere a UITabBarController e alla seconda delle sue sottoview da AppDelegate.UISplitview: accesso a UITabBarController da appDelegate

Storyboard with UISPlitViewCOntroller as root

Questo è quello che ho provato in 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)") 

Arresto anomalo dell'applicazione, lamenta che tabController è pari a zero. Se i rimuovere il controller UINavigation dalla storyboard, l'UITabBarController si accede facilmente con:

let tabController = splitViewController.viewControllers.first as! UITabBarController 

Qual è il modo corretto per accedere ai childcontrollers del UITabBarController, dove un UISplitView è la radice?

+0

Perché si dispone di un controller di navigazione seguita da un controller della barra delle linguette? Potresti spiegare come vorresti che fosse la navigazione della tua app? –

+0

Mi dispiace, non ho mostrato l'intero storyboard. Le viste collegate al tabbarcontroller sono le visualizzazioni delle tabelle, che ha segeus in dettaglioViewController (splitview detailviewcontroller). Se rimuovo UINavigationController, le viste dettagliate non avranno più la barra di navigazione con pulsanti e pulsante indietro diversi. –

risposta

4

Finalmente ho trovato una soluzione. Ho dovuto usare "childViewControllers" del controller di navigazione come questa:

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

ora posso facilmente accedere a qualsiasi dei viewControllers ed eseguire i loro metodi da AppDelegate :-)

1

Invece di incorporare il controller barra delle schede in un controller di navigazione, si dovrebbe incorporare i controller di vista bambino in propri controller di navigazione, in questo modo:

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

Questo è il modo corretto di utilizzare una barra delle schede in congiunzione con un controller di navigazione.

+0

Questo non sembra risolvere il problema. Bene, posso accedere alle sottoview, ma le viste dettagliate appariranno senza "backbutton". Inoltre sembrano apparire in modo modale (viene dal basso), anche io incorporo le visualizzazioni delle tabelle nei controller di navigazione. –

+0

Oh, ok. Bene, sono felice che tu abbia risolto il tuo problema :) –