簡體   English   中英

作法:重新排序后保存UITabBarItem的位置/順序

[英]How to: Save position/order of UITabBarItems after the have been reordered

好的,我一直在尋找這個問題的答案,但到目前為止沒有找到答案。

這是我的問題:我使用的是Apple提供的默認TabBarApplication。 由於創建了10個選項卡,因此它正在使用默認的重新排序過程。 因此,在重新排序選項卡並退出應用程序后,我想保存應用程序重新啟動時要恢復的選項卡的位置。 我該怎么做? 代碼樣例表示贊賞!

我知道這是一個古老的問題,但是我想發布此內容,因為這是我在查找操作方法時發現的內容。

因此,其他答案(就我撰寫本文而言)並不正確。 但是,當您引入本地化或使用導航項動態更改其標題時,它們會立即中斷,這兩種情況都是可能的。

我最終使用了restoreIdentifier,您可以在代碼中或在IB中將其設置為任何視圖控制器(或其子類)。

注意 :這是在UITabBarController的子類中實現的。

保存標簽欄視圖控制器訂單

NSMutableArray *tabBarVCIDs = [NSMutableArray new];
for (UIViewController *viewController in [self viewControllers])
    [tabBarVCIDs addObject:[viewController rootRestorationIdentifier]];

[[NSUserDefaults standardUserDefaults] setObject:tabBarVCIDs forKey:@"tabBarVCIDs"];
[[NSUserDefaults standardUserDefaults] synchronize];

加載選項卡欄項目順序

NSMutableArray *tabBarVCIDs = [[NSUserDefaults standardUserDefaults] objectForKey:@"tabBarVCIDs"];
if (tabBarVCIDs)
{
    NSMutableArray *viewControllers = [NSMutableArray new];
    for (NSString *vcID in tabBarVCIDs)
    {
        for (UIViewController *viewController in [self viewControllers])
        {
            if ([[viewController rootRestorationIdentifier] isEqualToString:vcID])
            {
                [viewControllers addObject:viewController];
                break;
            }
        }
    }
    [self setViewControllers:viewControllers];
}

rootRestorationIdentifier是我放入類別中的一種方法,即使視圖控制器位於導航控制器或拆分視圖控制器中,它也可以獲得正確的還原標識符(這對於布局可能稍有不同的通用應用程序很有用)。

- (NSString *)rootRestorationIdentifier
{
    if ([self isKindOfClass:[UINavigationController class]] || [self isKindOfClass:[UISplitViewController class]])
    {
        __weak UIViewController *rootVC = [[(UINavigationController *)self viewControllers] firstObject];
    return [rootVC rootRestorationIdentifier];
    }

    return [self restorationIdentifier];
}

您也可以使用NSPredicate代替嵌套的for循環,但這可能不是必需的。

tabItems存儲在數組中。 您可以執行以下操作(偽代碼):

* myArray = [tabBar tabBarItems];
* itemNameArray = [[NSMutableArray new] autorelease];
* for (UITabBarItem *item in myArray)
*     NSString *itemName = [item title];
*     [itemNameArray addObject: itemName];
* [[NSUserDefaults standardUserDefaults] setObject: itemNameArray forKey: @"TabItemNames"]

然后,在應用程序重新啟動時,加載陣列並以正確的順序設置選項卡項。

我也覺得這有點混亂。 希望我的研究可以幫助其他人...

我認為混淆是由於UITabBar.items返回的數組僅包含當前tabBar中可見的4個項目 當蘋果公司說你不應該碰到tabBar對象時,這就是它們的意思。

讀取項目順序(並更新項目順序)的方式是通過UITabBarController的viewControllers參數。

所以代碼看起來像(這在重寫UITabBarController的類中):

- (UIViewController *)vcWithTabBarTitle:(NSString *)name
{

    NSLog(@"looking for UIViewController with tabBarItem.title = %@", name);
    for (UIViewController *item in self.viewControllers)
    {
        if ([item.tabBarItem.title isEqualToString:name])
            return item;
    }

    return nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    NSArray *itemNames = [userDefaults objectForKey:@"viewControllersOrder"]

    if (itemNames != nil && itemNames.count > 0)
    {
        NSMutableArray *items = [NSMutableArray arrayWithCapacity:self.viewControllers.count];
        for (NSString *itemName in itemNames)
        {
            [items addObject:[self vcWithTabBarTitle:itemName]];
        }
        [self setViewControllers:items];
    }
}

- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
{
    if (changed)
    {
        NSMutableArray *itemNames = [[NSMutableArray alloc] initWithCapacity:viewControllers.count];
        for (UIViewController *item in viewControllers)
        {
            if (item.tabBarItem.title != nil)
            {
                [itemNames addObject:item.tabBarItem.title];
            }
        }

        [userDefaults setObject:itemNames forKey:@"viewControllersOrder"];
    }
}

暫無
暫無

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

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