簡體   English   中英

在基於情節提要的應用程序中的UITabBarController中禁用/啟用選項卡

[英]Disable/Enable tabs in UITabBarController in storyboard-based app

我已經使用情節提要構建了我的應用程序,並且所有視圖都由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];

(這似乎應該可以使用,但看起來也很粗糙。)

由於您使用的是基於情節提要的應用程序,因此我假設您已在情節提要中定義了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!)
                }
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM