【发布时间】:2012-10-20 02:05:13
【问题描述】:
我有 8 个选项卡,并且正在使用可自定义的 tabBarItems。因此用户可以重新排序选项卡。现在我的问题是如何获取选项卡的顺序并将其保存到 NSUserDefaults 以便用户退出应用程序并返回时它保持不变。
这是我目前得到的代码:
- (void)tabBar:(UITabBar *)tabBar didEndCustomizingItems:(NSArray *)items changed:(BOOL)changed {
NSMutableArray *savedOrder = [NSMutableArray arrayWithCapacity:8];
NSArray *tabOrderToSave = tabBarController.viewControllers;
for (UIViewController *aViewController in tabOrderToSave) {
[savedOrder addObject:aViewController.title];
}
[[NSUserDefaults standardUserDefaults] setObject:savedOrder forKey:@"savedTabOrder"];
}
该代码中没有错误,只是不起作用。
我做错了什么?
顺便说一句:我的应用是一个 tabBarApplication。
编辑: 这是我所做的。
创建了一个 tabBar 应用程序
使用数据填充的视图
添加了 8 个选项卡,其中包含从控制器加载的不同视图
然后添加了可自定义的选项卡重新排序
添加了上面的代码以保存标签顺序
重新启动应用程序时是否需要检索已保存的数据?
编辑 2:
我一直在四处寻找,发现了很多关于这方面的信息,但关于如何做的却很少。
这是我现在拥有的代码:
- (void)applicationWillTerminate:(UIApplication *)application {
/*
Called when the application is about to terminate.
See also applicationDidEnterBackground:.
*/
NSMutableArray *vcArray = [NSMutableArray arrayWithCapacity:6];
NSArray *savedViews = tabBarController.viewControllers;
for (UIViewController *theVC in savedViews){
[vcArray addObject:theVC.title];
}
[[NSUserDefaults standardUserDefaults] setObject:vcArray forKey:@"tabLayout"];
}
- (void)tabBar:(UITabBar *)tabBar didEndCustomizingItems:(NSArray *)items changed:(BOOL)changed {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *tabLayout = [defaults arrayForKey:@"tabLayout"];
NSMutableArray *orderedLayout = [NSMutableArray arrayWithCapacity:6];
NSArray *defaultOrder = tabBarController.viewControllers;
for (int i =0; i < 6; i++){
for (UIViewController *theVC in defaultOrder) {
if ([theVC.title isEqualToString:[tabLayout objectAtIndex:i]]) {
[orderedLayout addObject:theVC];
}
}
}
tabBarController.viewControllers = orderedLayout;
}
为什么这不起作用,我的意思是在我自定义标签栏并在 Xcode 中点击停止后,当我再次运行它时,它不会显示我保存的订单。我到底做错了什么?这是正确的方法吗?
【问题讨论】:
-
什么不起作用?您如何检测到这一点?
-
@Nekto 我在模拟器中启动应用程序,重新排列选项卡并退出。然后我重新启动应用程序,选项卡默认恢复到我重新排序之前的状态。这种重新排序行为在模拟器中不起作用吗?
-
在启动应用程序时如何加载视图?发布更多代码..
-
它也应该在模拟器中工作。
-
@TheHAWK .. 发布用于再次加载标签栏的代码