Подтвердить что ты не робот

В чем заключается использование - [NSUserDefaults registerDefaults:]?

В чем разница между:

[[NSUserDefaults standardUserDefaults] registerDefaults:
  [NSDictionary dictionaryWithObjectAndKey:anObject, @"something"]];

И это:

[[NSUserDefaults standardUserDefaults] setObject:anObject forKey:@"something"];
4b9b3361

Ответ 1

Разница в том, что первый фрагмент кода вы регистрируете значения по умолчанию, которые будут использоваться, когда пользователь не внес каких-либо изменений в "свойство".

Итак, если вы хотите предоставить 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.

Ответ 2

Короче говоря,

[[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

Ответ 3

Еще один способ взглянуть на это. Если вы удалите файл предпочтений из ~/Library/Preferences, значения по умолчанию, заданные registerDefaults, будут применяться к приложению до тех пор, пока не будут установлены новые настройки.

Ответ 4

В Swift 2.1.1 Xcode 7.2

Я добавил этот фрагмент в приложение: didFinishLaunchingWithOptions для инициализации tintColorsIndex, который является одним из параметров, которые пользователь может изменить в приложении.

    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.registerDefaults([
        "tintColorsIndex" : -1,
        ])

Когда приложение запускается в первый раз, tintColorsIndex будет назначено значение -1 (Int). Если пользователь изменил цвет при использовании приложения, их предпочтения не будут отменены при последующих запусках.