2012-04-19 8 views
5

He creado mi aplicación con guiones gráficos y todas las vistas están administradas por un control tabbar.Deshabilitar/Habilitar pestañas en UITabBarController en la aplicación basada en storyboard

Así en el lanzamiento (yo sólo estoy trabajando en la interfaz de usuario del iPad en la actualidad) que hace esto:

- (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; 
    } 
} 

Quiero ser capaz de activar o desactivar las pestañas de la tabBarController basado en la entrada del usuario (por lo , por ejemplo, un elemento debe seleccionarse en la primera pestaña para acceder a la segunda y tercera pestañas, que están deshabilitadas por defecto)

Lo que no tengo claro es cómo acceder a las pestañas para poder habilitar/insultarlos. Me gustaría crear una instancia de la AppDelegate y luego hacer algo como

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]; 

(Eso parece un poco como debería funcionar, pero también parece bastante grave.)

Respuesta

4

Dado que está utilizando una aplicación basada en Storyboard, Supongo que tiene el UITabBarController definido en el guión gráfico como el controlador raíz. Por cierto, también puede recuperarlo por identificador en lugar de caminar desde la ventana al controlador de vista raíz.

Restringir qué pestañas se pueden seleccionar, se logra configurando un delegado del UITabBarController (es decir, uno que cumple con UITabBarControllerDelegate).

En el delegado, se puede implementar estos dos métodos:

– tabBarController:shouldSelectViewController:

– tabBarController:didSelectViewController:

probable es que sólo tiene la primera para restringir (inhibir) la selección, hasta que su flujo de trabajo está listo.

Otro enfoque es establecer la propiedad "viewControllers" en el controlador de la barra de pestañas, cada vez que se pasa un hito. En cada hito, configura una matriz más expansiva de controladores de visualización en esta propiedad, lo que abrirá el selección del elemento de ficha adicional.

SWIFT 3

(ampliado para facilitar la comprensión)

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 
     } 

Esto puede ser usado en su viewWillAppear en ea ch tabulador. Verifique sus reglas con esto y restrinja cada pestaña en consecuencia. (método más 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!) 
       } 
      } 
     } 
    } 
Cuestiones relacionadas