В чем разница между:
[[NSUserDefaults standardUserDefaults] registerDefaults:
[NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];
И это:
[[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"];
В чем разница между:
[[NSUserDefaults standardUserDefaults] registerDefaults:
[NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];
И это:
[[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"];
Разница в том, что первый фрагмент кода вы регистрируете значения по умолчанию, которые будут использоваться, когда пользователь не внес каких-либо изменений в "свойство".
Итак, если вы хотите предоставить let say сказать "свойство" с ключевым именем "Приветственное сообщение", вы можете вместо того, чтобы вернуть свойство nil, вставить сообщение по умолчанию "Welcome first-time user", которое будет отображаться, когда не были изменены в собственность.
Это упростит вашу логику, потому что вам не нужно писать тест if
, чтобы проверить, возвращает ли свойство свойство nil, а затем создает другое сообщение, если это так.
NSString *greeting = [[NSUserDefaults standardUserDefaults] stringForKey:@"Greeting"];
if(greeting == nil) {
NSLog(@"Welcome first-time user!");
}
Второй фрагмент кода, который вы отправили, предназначен для установки свойства в другое значение. У вас будут разные методы набора (setString, setObject, setBoolean) для установки значений в зависимости от вашего состояния программы в Userdefaults.
ИЗМЕНИТЬ ----- Обновляется по запросу в комментариях.
Первый метод предназначен для регистрации значений по умолчанию, как следует из названия. При первом доступе к свойству с некоторым ключевым именем значение будет либо нулем для объектов, либо false для логических значений или 0 для чисел. Вместо того, чтобы делать множество тестов и так далее, чтобы, если значения не установлены в программе, а затем выполните что-то "по умолчанию", например, пример выше, вы можете отправить свое приложение с некоторыми уже предопределенными значениями для этих ключей.
Типичное место для установки registerDefaults находится в методе initializer в appDelegate.
Затем где-то в вашей программе вы можете установить значения этих полей, тогда вы используете setObject, setString, setBoolean... и для извлечения вы используете stringForKey, objectForKey...
Подумайте об этом как
RegisterDefaults - это конструктор, в котором вы можете предоставить разумные значения для объекта, иначе вы получите некоторые значения по умолчанию, которые я уже написал. Затем, если вы хотите изменить атрибуты объекта, вы НЕ используете "конструктор", а методы set/get.
Короче говоря,
[[NSUserDefaults standardUserDefaults] setObject:@"Entropy" forKey:@"kName"]
сохранит "Entropy" в файл с именем com.example.Demo.plist в папке Library/Preference (где com.example.Demo - ваш идентификатор пакета, см. Защита приложений IOS Часть 20 - Локальное хранилище данных)
[[NSUserDefaults standardUserDefaults] setObject:@"Mac OS X" forKey:@"kOS"];
NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
@"Windows", @"kOS",
@"Google", @"kSearchEngine", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kOS"]);
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kSearchEngine"]);
NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"kBrowser"]);
напечатает "Mac OS X", "Google", (null)
Действительно, registerDefaults
- не сохраняется на диск
- устанавливает значение для не заданных ключей ( "kOS" задается
setObject:forKey:
и "kSearchEngine" не установлен)- возвращает 0 для скалярных значений, nil для объектов, если этот ключ не установлен как
registerDefaults
, так иsetObject:forKey:
(в этом случае "kBrowser" )
И использование registerDefaults
Цитата из Руководство по настройкам и настройкам
Если эти стандартные значения по умолчанию не подходят для вашего приложения, вы могут регистрировать ваши собственные значения по умолчанию, используя registerDefaults: метод. Этот метод помещает ваши пользовательские значения по умолчанию в NSRegistrationDomain, что заставляет их возвращаться, когда предпочтение явно не задано.
Цитата из Как сохранить данные с помощью NSUserDefaults
Еще один совет: вы можете инициализировать NSUserDefaults с помощью предопределенный объект NSDictionary. Так, например, вы можете установить значение по умолчанию "false" или "true" перед тем, как пользователь когда-либо имел возможность взаимодействия с вашей программой. В моем случае иногда я создаю массив, который представляет все уровни в моей игре, и в каждом массиве value Я храню логическое значение, чтобы проверить, завершил ли игрок уровень. Для этого я создаю объект данных, а затем регистрирую его с помощью NSUserDefaults. Если для объекта существует предыдущее значение, то Ничего не произошло. В противном случае мой пустой объект будет сохранен как "по умолчанию", по умолчанию
PS: У Ole есть очень хорошая статья, объясняющая подробное описание значений по умолчанию с NSUserDefaults
Еще один способ взглянуть на это. Если вы удалите файл предпочтений из ~/Library/Preferences, значения по умолчанию, заданные registerDefaults
, будут применяться к приложению до тех пор, пока не будут установлены новые настройки.
В Swift 2.1.1 Xcode 7.2
Я добавил этот фрагмент в приложение: didFinishLaunchingWithOptions для инициализации tintColorsIndex, который является одним из параметров, которые пользователь может изменить в приложении.
let defaults = NSUserDefaults.standardUserDefaults()
defaults.registerDefaults([
"tintColorsIndex" : -1,
])
Когда приложение запускается в первый раз, tintColorsIndex будет назначено значение -1 (Int). Если пользователь изменил цвет при использовании приложения, их предпочтения не будут отменены при последующих запусках.
Пользовательские по умолчанию группируются в доменах... registerDefaults используется для добавления значений по умолчанию в домен регистрации.
Вы можете прочитать о доменах в Руководство по программированию настроек и настроек.