Итак, от начала до конца это то, что вам нужно делать / что должно происходить
В 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
, в противном случае это будет то, что приложение предварительно установило для него.