NSUserDefaults не удается сохранить после завершения работы приложения / запуска - PullRequest
3 голосов
/ 17 марта 2012

РЕДАКТИРОВАТЬ: Код обновлен, чтобы отражать предложения Paul.s.

Прошла чистая чистка в течение прошлой недели и до сих пор не может заставить мое приложение сохранить изменения настроек из приложения во время завершения работы / перезапуска приложения в Sim и Device.

Попытка использовать NSMutableDictionary от Singleton, но я не думаю, что это проблема.

a) Установите начальные значения по умолчанию для приложения, используя registerDefaults в приложении AppDelegate applicationDidFinishLaunchingWithOptions:

AppManager *global = [AppManager sharedInstance];


// set up the defaults.
global.gWantFoo = YES;    // This is a BOOL which relates to a UISwitch

// #define kWantFoo @"gWantFoo"
global.globalSettingsDict = [[NSMutableDictionary alloc] 
                               initWithObjectsAndKeys: 
                               [NSNumber numberWithBool:global.gWantFoo], kWantFoo, nil];

global.globalSettings = [NSUserDefaults standardUserDefaults];
[global.globalSettings registerDefaults:global.globalSettingsDict];
[global.globalSettings synchronize];

b) В ConfigView, где я могу установить переключатель, у меня есть селектор, который выполняет следующее при переключении переключателя.

self.global.gWantFoo = NOT(self.global.gWantFoo);   // #define NOT(a)  !(a)
[self.global.globalSettings setBool:self.global.gWantFoo forKey:kWantFoo];
[self.global.globalSettings synchronize];

c) У меня есть синхронизация в applicationDidEnterBackground и друзьях, и хотя значение переключателя сохраняет изменения в течение всего срока службы экземпляра приложения, после перезапуска gWantFoo перезаписывается со значением по умолчанию «YES».

Любой совет приветствуется. Я на грани дефенестрации моего больного профессионала MacBook с градом ругательств, следящих за ним. Хорошо, я спокойнее за это редактирование. Мне хочется потрясти MacBook Pro, чтобы продемонстрировать, что я недоволен NSUserDefaults: -)

Приветствия

СБН.

Ответы [ 2 ]

3 голосов
/ 17 марта 2012

Итак, от начала до конца это то, что вам нужно делать / что должно происходить

В application:didFinishLaunchingWithOptions: первое, что вы делаете, это регистрируете значения по умолчанию, как это:

NSDictionary *defaultsDefaults = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:NO] , PSWantFoo, nil];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults registerDefaults:defaultsDefaults];

Примечание: PSWantFoo определяется как NSString * const PSWantFoo = @"PSWantFoo";, поэтому у меня нет строковых литералов повсюду.

На этом этапе, если приложение никогда не запускалось NSLog(@"%d", [defaults boolForKey:PSWantFoo]);, оно напечатает 0.

Теперь, когда я хочу установить значение, я использую что-то вроде:

[defaults setBool:YES forKey:PSWantFoo];
[defaults synchronize];

Теперь при запуске NSLog(@"%d", [defaults boolForKey:PSWantFoo]); будет напечатано 1.

Что касается настойчивости на данный момент, так как я на самом деле установил значение, для меня создан plist на

<path to app>/Library/Preferences/<bundle identifier>.plist

Если вы проверите этот файл, вы увидите что-то вроде

<?xml version="1.0" encoding="UTF-8"?>
<DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PSWantFoo</key>
    <true/>
</dict>
</plist>

Теперь с этого момента это значение будет считываться в отличие от значения, зарегистрированного в registerDefaults:


Обновление

Почему вы жестко закодировали это в этом порядке?

// set up the defaults.
global.gWantFoo = YES;    // This is a BOOL which relates to a UISwitch

Почему бы не сделать это наоборот?

Регистрация значений по умолчанию со значением по умолчанию YES;

NSDictionary *defaultsDefaults = [[NSDictionary alloc] initWithObjectsAndKeys: 
                                   [NSNumber numberWithBool:YES], kWantFoo, nil];

[defaults registerDefaults:defaultsDefaults];

и после этого вы получаете настройку

global.gWantFoo = [defaults boolForKey:kWantFoo];

Таким образом, если приложение еще не установило предпочтение, ответ будет YES, в противном случае это будет то, что приложение предварительно установило для него.

0 голосов
/ 17 марта 2012

Вы должны установить флаг @ "gSettingsAreSet" после сохранения значений по умолчанию

[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"gSettingsAreSet"];
[[NSUserDefaults standardUserDefaults] synchronize];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...