2012-04-19 13 views
5

Ho costruito la mia app con gli storyboard e tutte le visualizzazioni sono gestite da un tabollontroller.Disabilita/Abilita le schede in UITabBarController nell'app basata su storyboard

Così il lancio (sto lavorando solo sul iPad UI al momento) lo fa:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
    { 
     UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; 
     UISplitViewController *splitViewController = [tabBarController.viewControllers objectAtIndex:0]; 
     UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; 
     splitViewController.delegate = (id)navigationController.topViewController; 

     UINavigationController *masterNavigationController = [splitViewController.viewControllers objectAtIndex:0]; 
     ProductionMasterViewController *controller = (ProductionMasterViewController *)masterNavigationController.topViewController; 
     controller.managedObjectContext = self.managedObjectContext; 
    } 
} 

Voglio essere in grado di attivare o disattivare le schede della tabBarController in base all'input dell'utente (in modo , ad esempio, un articolo deve essere selezionato nella prima scheda per accedere alla seconda e alla terza scheda, che sono disabilitate per impostazione predefinita)

Quello su cui non sono chiaro è come accedere alle schede per abilitare/disabilitare loro. Dovrei creare un'istanza della AppDelegate e poi fare qualcosa di simile

AppDelegate *d = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
UITabBarController *tabs = (UITabBarController *)[d.window rootViewController]; 
[[[[tabs tabBar] items] objectAtIndex:2] setEnabled:YES]; 
[[[[tabs tabBar] items] objectAtIndex:3] setEnabled:YES]; 
[[[[tabs tabBar] items] objectAtIndex:4] setEnabled:YES]; 

(Che sembra un po 'come dovrebbe funzionare, ma sembra anche abbastanza grave.)

risposta

4

Dal momento che si sta utilizzando un'applicazione basata Storyboard, Immagino che tu abbia lo UITabBarController definito nello storyboard come controller principale. Per inciso, è anche possibile recuperarlo per identificatore anziché camminare dalla finestra al controller della vista radice.

Restringendo quali schede sono selezionabili, si ottiene impostando un delegato di UITabBarController (ad esempio uno conforme a UITabBarControllerDelegate).

Nella delegato, è possibile implementare questi due metodi:

– tabBarController:shouldSelectViewController:

– tabBarController:didSelectViewController:

Probabilmente, basta il primo per limitare (inibire) la selezione, fino a quando il flusso di lavoro è pronto.

Un altro approccio consiste nell'impostare la proprietà "viewControllers" sul controller della barra delle schede, ogni volta che viene passata una pietra miliare. A ogni milestone, si imposta una gamma più ampia di controller di vista in questa proprietà, che aprirà la selezione della voce scheda aggiuntiva.

SWIFT 3

(esteso per facilità di comprensione)

let arrayOfTabBarItems = tabBarController?.tabBar.items 

     if let barItems = arrayOfTabBarItems, barItems.count > 0 { 
      os_log("barItems.count is now ", barItems.count) 
      tabBarItem0 = barItems[0] 
      tabBarItem0.isEnabled = true 
      tabBarItem1 = barItems[1] 
      tabBarItem1.isEnabled = true 
      tabBarItem2 = barItems[2] 
      tabBarItem2.isEnabled = true 
      tabBarItem3 = barItems[3] 
      tabBarItem3.isEnabled = true 
      tabBarItem4 = barItems[4] 
      tabBarItem4.isEnabled = true 
     } 

Questo può essere utilizzato nel vostro viewWillAppear su EA ch tab controller. Controlla le tue regole contro questo e limita ogni tab di conseguenza. (metodo più conciso)

let arrayOfAllTabBarItems = tabBarController?.viewControllers 
    if let tabBarArray = arrayOfAllTabBarItems, tabBarArray.count > 0 { 
     for x in 0...tabBarArray.count-1 { 
      let tabBarItem = tabBarArray[x] 
      if tabBarItem.title != nil { 
       if tabBarItem.title == "Tab1" || tabBarItem.title == "MyTab" || tabBarItem.title == "Tab2Check" { 
        tabBarItem.tabBarItem.isEnabled = !(isMyRuleTrue!) 
       } 
      } 
     } 
    } 
Problemi correlati