2011-01-31 5 views
5

У меня есть следующий код в моей инициализации (первый раз) моего приложения:Не удается установить NSUserDefaults поле

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *[email protected]"1"; 
[defaults setObject:uid forKey:@"init_val"]; 
[defaults synchronize]; 

Намного позже в коде (в ответ на нажатие кнопки) я проверяю значение с помощью:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *initVal=[defaults objectForKey:@"init_val"]; 

initVal всегда ноль. Я проверил, и init_val настроен точно так же, как и в моем наборе параметров, как другое поле, которое я могу установить и прочитать без проблем (они оба настроены с одним полем под названием «Ключ».

+0

Хм, нечетный. То же самое происходит, если вы используете -stringForKey: вместо -objectForKey :? Кроме того, делает -synchronize return YES? – macserv

+0

Сначала я попробовал stringForKey. И синхронизация возвращает ДА ​​ – mlewis54

+0

См. Мой ответ. Я уверен, что вы получите свое решение в моем ответе. Оставьте комментарий, если у вас возникнут какие-либо проблемы с моим ответом. –

ответ

5

@ mlewis54:

Вы можете попробовать этот код. Я очень уверен, что это сработает для вас.

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *[email protected]"1"; 
[defaults setObject:uid forKey:@"init_val"]; 
[defaults synchronize]; 

для извлечения данных вы должны использовать следующий код:

NSString *initVal=[[NSUserDefaults standardUserDefaults] valueForKey:@"init_val"]; 

ИЛИ

NSString *initVal=[[NSUserDefaults standardUserDefaults] objectForKey:@"init_val"]; 

EDIT:

Если еще дает nil, то вы можете использовать следующий код:

NSString *initVal=[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] valueForKey:@"init_val"]]; 

ИЛИ

NSString *initVal=[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"init_val"]]; 

Надеется, что это помогает вам.

+0

Спасибо за ответ. В конце концов я начал работать так. В конце концов, это оказалось спорным. Я переместил настройки в приложение и больше не использовал набор настроек или значения по умолчанию. Я ценю вклад каждого. – mlewis54

+0

@ mlewis54: Добро пожаловать. Я рад, что это вам помогло. :-) –

0

Нет ничего плохого в том, ваш код, я пытался копировать его в моем проекте, и она работала хорошо, так что ваша ошибка может быть, вероятно, когда вы проверяете initVal ...

что код, который вы используете, чтобы увидеть, если initVal равна нулю? и вы убедитесь, что когда/где вы проверите initVal, то var/oblect все еще отображается?

попробуйте ввести это сразу же после кода:

NSLog(@"____text read in pref: %@", initVal); 

он пишет об этом в моем окне консоли ->_ _TEXT читать прив: 1

конечно что это NSString, я надеюсь, что вы держите в виду, что это не INT или NSNumber когда вы проверяете его ...

Luca

+0

Я проверяю initVal, используя if (! InitVal) {<<<, а не не указан >>>}. Я отправлю значение отладчика, когда вернусь к столу. Я считаю, что это 0x0. Проблема с объемом не возникает, так как я выполняю инструкции в строке (выше, где я получаю значения по умолчанию, а затем оператор if). – mlewis54

+0

, то я заверяю вас, что код верен, я пробовал это: NSString * initVal = [defaults objectForKey: @ "init_val"]; if (! InitVal) { \t NSLog (@ "__ 1__text читать в pref:% @", initVal); } else { \t NSLog (@ "__ 2__text читать в pref:% @", initVal); // это выполняется } в окне консоли: __2__text читать прив: 1 то ошибка должна быть в другом месте ... пытаются «очистить все цели» в меню «создать» в Xcode ... делает это происходит в устройстве или в симуляторе? – meronix

+0

Оба. Чистый не помог. – mlewis54

0

вы уверены, что правильно инициализировать NSUserDefaults? Когда я инициализации, в мое приложение делегата, я всегда создаю по умолчанию пользователя по умолчанию путем создания словаря значений по умолчанию, то:

[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; 

Где appDefaults это словарь. Тогда вы должны иметь доступ к ним правильно.

+0

В другом месте делегата приложения я устанавливал словарь со значениями по умолчанию (значение/ключ). – mlewis54

1

Вы должны использовать линию

NSString *initVal = [defaults stringForKey:@"init_val"]; 

- так как это строка, которую вы должны использовать . Аналогично можно использовать boolForKey для получения логического значения.

0

Возможно, инициализация не происходит. Поместите NSLog там, чтобы проверить, что он выполнен.

0

Он отлично работает для меня с тем же кодом:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *[email protected]"1"; 
[defaults setObject:uid forKey:@"init_val"]; 
[defaults synchronize]; 

NSUserDefaults *defaultss = [NSUserDefaults standardUserDefaults]; 
NSString *initVal=[defaultss objectForKey:@"init_val"]; 
NSLog(@"Value of initVal: %@",initVal); 

O/P на консоли: Значение initVal: 1

Так что попробуйте сделать это с тем же кодом с печатью на консоли.

1

Decelare это на мероприятии по нажатию кнопки ...

NSUserDefaults *savedData = [NSUserDefaults standardUserDefaults]; 
[savedData setObject:userEmailTextField.text forKey:@"userid"]; 

и при загрузке загрузки данных и проверьте значение, которое вы ввели показывает или нет ...

userEmailTextField.text =[[NSUserDefaults standardUserDefaults]objectForKey:@"userid"]; 
Смежные вопросы