在基于故事板的应用程序中禁用/启用UITabBarController中的选项卡

我用故事板构建了我的应用程序,所有视图都由tabbarcontroller管理。

所以在发布时(我目前只在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]; 

(这似乎应该有用,但看起来也相当粗糙。)

由于您使用的是基于Storyboard的应用程序,我假设您在故事板中定义了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中使用。 检查您的规则并相应地限制每个选项卡。 (更简洁的方法)

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