Как сохранить порядок вкладок в NSUserDefaults - PullRequest
0 голосов
/ 13 сентября 2011

У меня 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.

EDIT: Вот что я сделал.

Создано приложение 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, когда я снова запускаю ее, она не показывает мой сохраненный заказ. Что в мире я делаю не так? Это правильный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2011

Как @Nekto сказал - Что не работает?Как вы обнаружите это?

также сохранение этой информации не сохранит ваш порядок на панели вкладок ... вы должны извлечь этот заказ из nsuserdefault и в следующий раз сгенерировать вкладку в таком порядке ..

0 голосов
/ 19 октября 2012

Вот код, который я использовал

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

}
0 голосов
/ 13 сентября 2011

Вам не хватает синхронизации. Попробуйте это:

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