Как правильно работать (получать значения) с NSUserDefaults - PullRequest
3 голосов
/ 02 марта 2009

В моем коде есть простой метод, который выглядит следующим образом:

- (BOOL)isFirstTimeLogin 
{
    NSString *t_gName = 
    [NSString stringWithFormat:@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:kGroupIdentifierKey]];
    if ([t_gName isEqualToString:@""] || t_gName == nil) {
        DLog(@"LoginViewController, m:::isFirstTimeLogin, First time login happening.");
        return YES;
    }

    DLog(@"LoginViewController, m:::isFirstTimeLogin, Not a first time login.");
    return NO;
}

Просто перейдите в комплект настроек и получите значение из спецификатора PSTextFieldSpecifier. Если я вручную захожу и добавляю произвольный текст, код работает как положено. Однако всякий раз, когда я впервые устанавливаю приложение на новое устройство, первое условие выполняется как ложное, что должно быть верно. Пройдя по коду, GDB доказывает, что объект действительно также равен нулю:

(gdb) po t_gName
(Нуль)

Что я тут не так делаю? Почему это условие не выполняется в первый раз, когда приложение установлено, и t_gName является пустым / нулевым PSTextFieldSpecifier. Я даже дошел до попытки добавить DefaultValue в свой пакет настроек пустой строки.

Ответы [ 2 ]

15 голосов
/ 02 марта 2009
[NSString stringWithFormat:@"%@", nil];

Это создает что-то вроде этого:

@"(null)"

и, следовательно, не является ни nil, ни равным @"".

кстати

  1. Вам вообще не нужно stringWithFormat:.
  2. Не проверять на string == nil, но на !string
  3. Вам не нужно проверять пустую строку, так как есть один набор или nil.
  4. Используйте лучшее имя, чем t_gName, для коротких имен нет причин.

Вот так:

- (BOOL)isFirstTimeLogin 
{
    NSString *groupIdentifier = [[NSUserDefaults standardUserDefaults]
                                    objectForKey:kGroupIdentifierKey];
    if (!groupIdentifier) {
        DLog(@"First time login.");
        return YES;
    }

    DLog(@"Not a first time login.");
    return NO;
}
1 голос
/ 27 августа 2014

Попробуйте это:

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
     {

        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"HasLaunchedFirstTime"])
        {
            // app already launched
            NSLog(@"app already launched");

        }
        else
        {
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasLaunchedFirstTime"];
            [[NSUserDefaults standardUserDefaults] synchronize];

             NSLog(@"First Time");

            // This is the first launch ever
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...