2012-04-19 79 views
5

我已经使用故事板构建了我的应用程序,并且所有视图都由tabbarcontroller管理。在基于storyboard的应用程序中禁用/启用UITabBarController中的选项卡

所以在启动(我只工作目前iPad的UI),它这样做:

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

我希望能够根据用户输入启用或禁用tabBarController标签(所以,例如,需要在第一个标签中选择一个项目才能访问默认禁用的第二个和第三个标签)

我不清楚的是如何访问标签以便启用/消除它们。我想创建的appdelegate的一个实例,然后像做

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

(这有点儿好像它应该工作,但它似乎也相当恶心。)

回答

4

由于您使用的是基于故事板的应用,我假设你有故事板中定义的UITabBarController作为根控制器。顺便提一句,你也可以通过标识符来取代它,而不是从窗口走到根视图控制器。

通过设置UITabBarController的代表(即符合UITabBarControllerDelegate的代理)来实现限制哪些选项卡是可选的。

在委托时,就可以实现这两个方法:

– tabBarController:shouldSelectViewController:

– tabBarController:didSelectViewController:

有可能的,你只需要第一个限制(禁止)的选择,直到您的工作已准备就绪。

另一种方法是在标签栏控制器上设置“viewControllers”属性,每次传递一个里程碑时,在每个里程碑处,将更多的视图控制器设置到该属性中,这将打开选择的其他选项卡项目。

SWIFT 3

(扩大为了便于理解)

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 
     } 

这可以在viewWillAppear中使用的EA ch选项卡控制器。检查你的规则,并相应地限制每个标签。 (更简洁的方法)

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!) 
       } 
      } 
     } 
    } 
相关问题