【问题标题】:How to save order of tabs to NSUserDefaults如何将选项卡的顺序保存到 NSUserDefaults
【发布时间】: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 .. 发布用于再次加载标签栏的代码

标签: ios tabs tabbar


【解决方案1】:

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

- (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];
}

【讨论】:

    【解决方案2】:

    正如@Nekto 所说 - 什么不起作用?您如何检测到这一点?

    保存此信息也不会保存您的选项卡顺序...您必须从 nsuserdefault 获取此顺序并在下次按该顺序生成选项卡..

    【讨论】:

    • 不保存订单!我如何获取@Saurabh 的订单? @Nekto 我用 nib 加载视图,我只是将它设置为 xib 控制器类,视图加载正常。
    • 我需要做什么来完成这个?
    • @TheHAK - 如果您使用 nib (xib) 来生成 tabbarcontroller 的视图,则无法完成此操作。 ..您必须使用编码生成视图..您需要从 nsuserdefaults 获取选项卡顺序并以相同的顺序生成选项卡
    • 我正在使用代码来生成 tabBar 和视图。如何从 NSUserDefaults 中获取标签顺序并以相同的顺序生成标签?
    • 我在原始帖子中添加了一些信息。现在一切都清楚了吗?
    【解决方案3】:

    这是我一直在使用的代码

    -(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;
        }
    
    }
    

    【讨论】:

    • PS -- 在没有先点击圆形主页按钮让模拟器关闭应用程序之前,切勿在模拟器中点击“停止”。您希望进行一些重要的内务处理(例如同步默认值)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多