我知道这是一个老问题,但我想发布此问题,因为这是我在查找如何执行此操作时发现的。
所以其他答案(在我写这篇文章时)并不正确。但是,当您引入本地化或具有动态更改其标题的导航项时,它们会立即中断,这两种情况都非常可能。
我最终使用了 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 循环,但这可能不是必需的。