如何将选项卡的顺序保存到NSUserDefaults

时间:2011-09-13 11:32:59

标签: ios tabs tabbar

我有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;
}

为什么这不起作用,我的意思是在我自定义tabbar并在Xcode中点击停止后,当我再次运行它时它不会显示我保存的订单。世界上我做错了什么?这是正确的方法吗?

3 个答案:

答案 0 :(得分:0)

你错过了同步。 试试这个:

- (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"];
    [[NSUserDefaults standarduserDefaults] synchronize];
}

答案 1 :(得分:0)

正如@Nekto所说 - 什么不起作用?你怎么发现这个?

同时保存此信息不会保存您的标签栏顺序...您必须从nsuserdefault获取此订单并在下次按顺序生成标签..

答案 2 :(得分:0)

这是我一直在使用的代码

-(void) saveTabOrder
{

    NSMutableArray *savedOrder = [NSMutableArray arrayWithCapacity:6];
    NSArray *tabOrderToSave    =   tabBarController.viewControllers;
    for (UIViewController *aViewController in tabOrderToSave) 
    {
        [savedOrder addObject:aViewController.title];
    }

    [[NSUserDefaults standardUserDefaults] setObject:savedOrder forKey:@"savedTabOrder"];
    //[[NSUserDefaults standardUserDefaults] synchronize];

}

//注意 - 因为标签可能会在应用版本之间发生变化, //如果选项卡计数或名称,则不应尝试恢复选项卡 //与保存的版本不同。

- (void)setTabOrderIfSaved {
    //return;

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSArray *savedOrder = [defaults arrayForKey:@"savedTabOrder"];
    NSMutableArray *orderedTabs = [NSMutableArray arrayWithCapacity:6];

    if ([savedOrder count] > 0 )     
    {
        for (int i = 0; i < [savedOrder count]; i++)  // loop through saved tabs
        {
            BOOL tabFound = NO;
            for (UIViewController *aController in tabBarController.viewControllers) // loop through actual tabs
            {
                if ([aController.title isEqualToString:[savedOrder objectAtIndex:i]]) 
                {
                    [orderedTabs addObject:aController];
                    tabFound = YES;
                }
            }
            if (!tabFound) 
            {
                // so the old tab order doesn't include this tab.  Lets bail and use the default ordering
                [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"savedTabOrder"];
                return;
            }
        }
        tabBarController.viewControllers = orderedTabs;
    }

}