Сбрасывать определенный ключ NSUserDefaults только тогда, когда приложение получает обновление - PullRequest
1 голос
/ 12 января 2012

У меня есть два ключа NSUserDefaults: первый связан с тем, чтобы показать небольшое вступительное окно, а второй связан с изменением цвета фона ячеек в моем tableView для первых 3 сеансов.

Теперь, когда я обновляю свое приложение, я хочу сбросить второй ключ, чтобы показать другой цвет фона ячеек для первых 3 сеансов.

Это мой код в моем делегате приложения:

[[NSUserDefaults standardUserDefaults] setObject: @"1.3.5" forKey:@"lastVer"];//in memory
    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    NSLog(@"**** Version: %@",version);

    NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 
   if(![lastVersion isEqualToString: version]){
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
    }
    else { 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@"This is Run Number: %d", [runNumber intValue]);    
    }

    if (runNumber == [NSNumber numberWithInt:0]){
       [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@"Run number: %d", [runNumber intValue]);    
    }

(Примечание: runNumber - это ключ, который хранит цвет фона ячеек для 3 сеансов)

проверяет, равен ли lastVersion версии пакета, и сбрасывает ключ для runNum (присваивая ему значение 0). Затем, если runNum равен 0, он увеличивает runNumbers.

Но есть проблема!

Когда lastVersion отличается от версии, он сбрасывает ключ, но я не знаю, как снова увеличить runNum, не сбрасывая снова количество прогонов, потому что runNum сбрасывается при каждом открытии приложения!

т.е.

lastVersion = 1.3.4
version = 1.3.5
if lastVersion is different from version, then runNum == 0
and if runNum == 0, runNum = runNum + 1
//CLOSING AND REOPENING THE APP
runNum = 0 
runNum = runNum +1
//CLOSING AND REOPENING THE APP
runNum = 0
runNum = runNum + 1
//and so on..

Когда я закрываю и снова открываю приложение, ключ runNum снова равен 0!

Как я могу сбросить ключ runNum ТОЛЬКО один раз, а затем снова увеличить его?

EDIT

Я внес следующие изменения:

NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"]; 

    // get the current bundle version. 
    NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 


    NSLog(@"Last Version: %@, New Version: %@", lastVersion, currentVersion); 

    NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 
    NSInteger runNumberValue = [runNumber integerValue]; 


    if(![lastVersion isEqualToString: currentVersion]){ 
        NSLog(@"Last Version and Version are not same."); 
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
        NSLog(@"last Version is: %@",lastVersion);

    } 
    else { 
        NSLog(@"Last Version and Version are same."); 
        NSInteger newRunNumberValue = runNumberValue++; 
        if(newRunNumberValue > 2) { 
            newRunNumberValue = 0; 
        } 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:newRunNumberValue] forKey:@"runNum"]; 
    }

И вот код, который заставляет фон ячеек меняться в первые 3 сеанса:

    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"]; 

// get the current bundle version. 
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

NSLog(@"Last Version: %@, New Version: %@", lastVersion, currentVersion); 

NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 

if (!runNumber) { 
    NSLog(@"**** Resetting Run Number to zero ****"); 
    NSNumber *runNumber = [NSNumber numberWithInt:0]; 
    [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
} else { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
    NSLog(@"This is Run Number: %d", [runNumber intValue]); 
} 


if(![lastVersion isEqualToString: currentVersion]){ 
    NSLog(@"Last Version and Version are not same."); 
    [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
    NSLog(@"last Version is: %@",lastVersion);
    //What should i do here to make the updated app show the different cells background?
} 
else { 
    NSLog(@"Last Version and Version are same."); 
    //What should i do here to make the updated app show the different cells background?
}

Теперь: как я могу заставить приложение отображать фон различных ячеек, когда пользователь загружает его впервые (3 сеанса) и когда пользователь обновляет приложение (даже после N сеансов)? Я застрял здесь.

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 14 января 2012

Я решил это сам!

 if(![lastVersion isEqualToString: currentVersion]){ 
        NSLog(@"Last Version and Version are not same."); 
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
        NSLog(@"last Version is: %@",lastVersion);
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
        NSLog(@"runNumber is: %d",[runNumber intValue]);

    } 
    else { 
        NSLog(@"Last Version and Version are same."); 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@" Run Number: %d", [runNumber intValue]);    
    }
2 голосов
/ 13 января 2012

Вы должны сбросить номер прогона, когда последняя версия не равна текущей версии. Это будет при первом запуске вашей новой версии. Поэтому, прежде чем обновлять пользовательские значения по умолчанию для номера версии из вашего пакета, сбросьте номер прогона в этой точке.

0 голосов
/ 13 января 2012

Хотя ваш вопрос не очень понятен, я просто пытаюсь помочь, основываясь на том, что я мог понять. Пожалуйста, измените ваш вопрос, чтобы описать вашу проблему более четко.

Можете ли вы записать значение вашей версии NSString *.

т.е. сразу после:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

положить

NSLog(@"version %@", version);

Это должно гарантировать, что ваш

if([lastVersion isEqualToString: version]){ 
...
}

выполнено или нет.

Более того, вам не нужно удалять ключ из NSUserDefaults просто для его обновления. Вы можете безопасно удалить эту строку из своего кода:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"runNum"];

Просто внесите эти изменения и дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...