![](/img/trans.png)
[英]How to specify width, flexible space and/or position between UITabBarItems in UITabBar?
[英]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.