2015-08-05 3 views
0

Когда выполняется следующий код, он регистрирует «0», хотя выбранный indexPath.row является «1».NSInteger потеряет значение при сохранении в NSUserDefaults

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
NSInteger location = indexPath.row; 
[userDefaults setInteger:location forKey:@"savedlocations"]; 
NSInteger location2 = [userDefaults integerForKey:@"savedlocation"]; 
NSLog(@"l: %ld", location); 
+5

У вас есть опечатка в вашем ключевом названии. –

ответ

1

У вас есть несколько вещей, которые должны быть исправлены:

  • Вы экономите с ключом savedlocations, но извлечение его с savedlocation. Обратите внимание, что первое - это множественное число.
  • Вы регистрируете location, а не location2, что и происходит с NSUserDefaults. location2 всегда будет 0, из-за точки выше.
  • Редактировать: У меня был третий пункт здесь о вызове synchronize, но, оказывается, это не имеет отношения к этой ситуации, как объясняется rmaddy в комментариях ниже.

Кроме этих быстрых исправлений, ваша конфигурация должна работать.

+1

Ваш последний пункт неверен. Вам не нужно вызывать 'synchronize', чтобы сразу читать значение. – rmaddy

+0

@rmaddy В документации указано * «Поскольку этот метод автоматически вызывается с периодическими интервалами, используйте этот метод, только если вы не можете дождаться автоматической синхронизации» *. Можно ли считать, что автоматическая синхронизация всегда будет происходить, прежде чем нам нужно будет прочитать значения? – Nerrolken

+1

Это другое дело. Пользовательские значения по умолчанию - это не что иное, как словарь, который сохраняется в файле plist время от времени. Когда вы устанавливаете значение в пользовательских значениях по умолчанию, словарь в памяти обновляется и может быть считан сразу. Это пласт, который иногда обновляется. Вы можете принудительно обновить plist с помощью вызова 'synchronize'. Единственный раз, когда вам нужно позвонить 'synchronize', - это когда приложение переходит в фоновый режим (чтобы быть в безопасности) или после установки действительно важного значения, которое не должно быть потеряно, если приложение выйдет из строя, прежде чем плагин будет обновлен сам по себе. – rmaddy

-1

Вы ищете ключевое слово "savedlocation" вместо "savedlocations".

EDIT:

0 возвращается методом, что и возвращается для NSInteger, которые не могут быть найдены. Мое плохое из-за странной формулировки.

+0

Нет необходимости называть 'synchronize'. – rmaddy

+0

И «integerForKey:' не возвращает «null» за неправильный ключ. Он возвращает '0', так как это' NSInteger'. – rmaddy

+0

Вынул синхронизированную часть, вы правы на этом. Извините, если моя формулировка сбивает с толку, я сказал, что она возвращает 0, что является «нулевым» эквивалентом для NSInteger в глазах системы. – jrisberg