【问题标题】:Disable/Enable tabs in UITabBarController in storyboard-based app在基于故事板的应用程序中禁用/启用 UITabBarController 中的选项卡
【发布时间】:2012-05-01 07:12:34
【问题描述】:

我用故事板构建了我的应用程序,所有视图都由标签栏控制器管理。

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

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

【问题讨论】:

    标签: ios uitabbarcontroller storyboard


    【解决方案1】:

    由于您使用的是基于 Storyboard 的应用程序,我假设您在 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!)
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多