Deshabilitar / Habilitar tabs en UITabBarController en la aplicación basada en Storyboard

He creado mi aplicación con storyboards y todas las vistas están gestionadas por un tabbarcontroller.

Entonces, en el lanzamiento (solo estoy trabajando en la interfaz de usuario del iPad actualmente), 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 poder habilitar o deshabilitar las tabs en tabBarController en function de la input del usuario (por lo tanto, se debe seleccionar un elemento en la primera pestaña para acceder a la segunda y tercera tabs, que están deshabilitadas de manera pnetworkingeterminada)

Lo que no estoy claro es cómo acceder a las tabs para habilitarlas / deshabilitarlas. ¿Crearía una instancia de appdelegate y luego haría algo como

 AppDelegate *d = (AppDelegate *)[[UIApplication shanetworkingApplication] 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]; 

(Parece que debería funcionar pero parece bastante asqueroso).

Dado que está utilizando una aplicación basada en Storyboard, supongo que tiene el UITabBarController definido en el storyboard como el controller raíz. Incidentalmente, también puede recuperarla por identificador en lugar de caminar desde la window al controller de vista raíz.

Restringiendo qué tabs son seleccionables, se logra estableciendo un delegado del UITabBarController (es decir, uno que se ajusta a UITabBarControllerDelegate ).

En el delegado, puede implementar estos dos methods:

– tabBarController:shouldSelectViewController:

– tabBarController:didSelectViewController:

Probablemente, solo necesita el primero para restringir (nhibernate) la selección, hasta que su flujo de trabajo esté listo.

Otro enfoque consiste en establecer la propiedad "viewControllers" en el controller de la barra de tabs, cada vez que se pasa un hito. En cada hito, configura una matriz más amplia de controlleres de vista en esta propiedad, lo que abrirá la selección del controller adicional elemento de pestaña

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 se puede usar en su vista. Aparecerá en cada controller de tabs. Revisa tus reglas en contra de esto y restringe 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!) } } } }