2012-04-19 10 views
5

Ich habe meine App mit Storyboards erstellt und alle Ansichten werden von einem Tab-Controller verwaltet.Disable/Enable Tabs in UITabBarController in Storyboard-basierte App

So beim Start (ich bin nur auf dem iPad UI arbeitet derzeit) es tut dies:

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

Ich möchte die Reiter in der TabBarController in der Lage sein zu aktivieren oder deaktivieren, basierend auf Benutzereingaben (so Zum Beispiel muss ein Element auf der ersten Registerkarte ausgewählt werden, um auf die zweite und dritte Registerkarte zuzugreifen, die standardmäßig deaktiviert sind.)

Ich weiß nicht, wie ich auf die Registerkarten zugreifen soll aktivieren/deaktivieren Sie sie. Würde ich eine Instanz der AppDelegate erstellen und dann etwas tun, wie

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

(Das irgendwie scheint, wie es funktionieren sollte, aber es scheint auch ziemlich gross.)

Antwort

4

Da Sie eine Storyboard-basierte Anwendung verwenden, Ich nehme an, Sie haben die UITabBarController im Storyboard als Root-Controller definiert. Übrigens, Sie können es auch per Bezeichner abrufen, anstatt vom Fenster zum Root-View-Controller zu gehen.

Die Beschränkung, welche Registerkarten auswählbar sind, wird erreicht, indem ein Delegat des UITabBarControllers (d. H. Einer, der UITabBarControllerDelegate entspricht) gesetzt wird.

In den Delegierten, können Sie diese beiden Methoden implementieren:

– tabBarController:shouldSelectViewController:

– tabBarController:didSelectViewController:

Wahrscheinlich brauchen Sie nur die erste (inhibieren) Auswahl zu beschränken, bis Ihr Workflow bereit ist. Ein anderer Ansatz besteht darin, die "viewControllers" -Eigenschaft auf dem Tab-Bar-Controller jedes Mal zu setzen, wenn ein Meilenstein übergeben wird. Bei jedem Meilenstein setzen Sie ein expansiveres Array von View-Controllern in diese Eigenschaft, was den Auswahl des zusätzlichen Registerkarte Artikels.

SWIFT 3

(zum leichteren Verständnis erweitert)

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 
     } 

Dieser in Ihrem viewWillAppear auf ea verwendet werden kann, ch Registerkarte Controller. Überprüfen Sie Ihre Regeln und beschränken Sie jeden Tab entsprechend. (genauere Methode)

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!) 
       } 
      } 
     } 
    } 
Verwandte Themen