Пользовательские значения по умолчанию и привязка

Много приложений обеспечивают предпочтительное окно, позволяющее пользователю настраивать настройки приложения. NSUserDefaultsController обеспечивает уровень поверх NSUserDefaults и позволяет Вам связывать атрибуты элементов интерфейса пользователя к соответствующему ключу в пользовательских значениях по умолчанию приложения.

Что такое NSUserDefaultsController?

NSUserDefaultsController является конкретным подклассом NSController, реализующего совместимый с привязкой интерфейс к NSUserDefaults. Свойства экземпляра NSUserDefaultsController обязаны с элементами интерфейса пользователя получить доступ и изменить значения, сохраненные с помощью NSUserDefaults.

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

По умолчанию NSUserDefaultsController сразу применяет любые изменения, внесенные в его свойства. Это может быть сконфигурировано так, чтобы изменения не были применены, пока это не получает applyChanges: сообщение, позволяя предпочтительному диалоговому окну поддерживать кнопку Apply. NSUserDefaultsController также поддерживает возвращение к последнему прикладному набору значений, с помощью revert: метод.

NSUserDefaultsController также позволяет Вам обеспечивать словарь заводских настроек, которые могут использоваться для сброса пользователя конфигурируемые значения для приложения, обычно делавшегося в ответ на пользователя, нажимающего кнопку Revert to Factory Defaults.

Совместно используемый пользовательский контроллер значений по умолчанию

NSUserDefaultsController обеспечивает совместно используемый экземпляр себя через метод класса sharedUserDefaultsController. Этот совместно используемый экземпляр использует экземпляр NSUserDefaults, возвращенный методом standardUserDefaults как его модель, не имеет никаких начальных значений, и сразу применяет изменения, внесенные посредством его привязки.

Необходимо соблюдать осторожность, что изменения в настройках совместно используемого пользовательского контроллера значений по умолчанию внесены, прежде чем любые файлы пера, содержащие привязку к совместно используемому контроллеру, загружаются. Чтобы гарантировать, что эти изменения внесены, перед, любые файлы пера загружаются, они часто реализуются в initialize метод класса делегата приложения, или в Вашем предпочтительном контроллере окна.

Привязка с совместно используемым пользовательским контроллером значений по умолчанию

Совместно используемый NSUserDefaultsController всегда доступен как связываемый контроллер в окне Bindings Info в Интерфейсном Разработчике. При установлении привязки с пользовательским значением по умолчанию, установленным Ключ Контроллера к values, и Ключевой Путь Модели к ключу значения по умолчанию.

Создание привязки программно требует, чтобы Вы получили совместно используемый пользовательский контроллер значений по умолчанию с помощью метода класса NSUserDefaultsController sharedUserDefaultsController. Вы тогда обеспечиваете тот объект как observableController к bind:toObject:withKeyPath:options: метод.

Пример в Перечислении 1 устанавливает привязку между NSTextField (theTextField) и userName значение по умолчанию с помощью совместно используемого пользовательского контроллера значений по умолчанию.

Перечисление 1  , Связывающее ключ значений по умолчанию имени пользователя с NSTextField программно

 [theTextField bind:@"value"
             toObject:[NSUserDefaultsController sharedUserDefaultsController]
          withKeyPath:@"values.userName"
              options:[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES]
                                                  forKey:@"NSContinuouslyUpdatesValue"]];

initialValues По сравнению с NSUserDefaults registerDefaults:

Словарь начальных значений позволяет Вам обеспечивать средние значения для сброса пользователя конфигурируемые значения по умолчанию к заводским настройкам. Обычно эти значения представляют подмножество значений по умолчанию что Ваши регистры приложения с помощью метода NSUserDefaults registerDefaults:.

Вызов метода NSUserDefaultsController setInitialValues: не должен считаться заменой для регистрации предпочтительного использования значений по умолчанию Вашего приложения NSUserDefault registerDefaults: метод.

Пример в Перечислении 2 загружает значения по умолчанию из файла в обертке приложения, регистрирует те значения в NSUserDefaults, и затем регистрирует подмножество значений как начальные значения совместно используемого пользовательского контроллера значений по умолчанию. setupDefaults метод вызвали бы от Вашего делегата приложения initialize метод класса.

Перечисление 2  , Изменяющее начальные значения sharedUserDefaultsController экземпляра

+ (void)setupDefaults
{
    NSString *userDefaultsValuesPath;
    NSDictionary *userDefaultsValuesDict;
    NSDictionary *initialValuesDict;
    NSArray *resettableUserDefaultsKeys;
 
    // load the default values for the user defaults
    userDefaultsValuesPath=[[NSBundle mainBundle] pathForResource:@"UserDefaults"
                               ofType:@"plist"];
    userDefaultsValuesDict=[NSDictionary dictionaryWithContentsOfFile:userDefaultsValuesPath];
 
    // set them in the standard user defaults
    [[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValuesDict];
 
    // if your application supports resetting a subset of the defaults to
    // factory values, you should set those values
    // in the shared user defaults controller
    resettableUserDefaultsKeys=[NSArray arrayWithObjects:@"Value1",@"Value2",@"Value3",nil];
    initialValuesDict=[userDefaultsValuesDict dictionaryWithValuesForKeys:resettableUserDefaultsKeys];
 
    // Set the initial values in the shared user defaults controller
    [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:initialValuesDict];
}

Поисковый порядок на значения значений по умолчанию

: когда метод, который является значением ключа, кодирующим совместимые попытки получить значение для ключа от NSUserDefaultsController следующий поисковый образец используется,

  1. Значение соответствующего ключа values

  2. Значение соответствующего ключа в экземпляре NSUserDefaults, возвращенном методом NSUserDefaultsController defaults.

  3. Значение соответствующего ключа в словаре начальных значений

Если никакое соответствующее значение не найдено, nil возвращается.

Путь поиска несколько отличается при получении результата непосредственно от экземпляра NSUserDefaults, связанного с NSUserDefaultsController. В этом случае любые остающиеся без применения значения в NSUserDefaultsController, а также значения в словаре начальных значений проигнорированы.

Программно получающие доступ значения NSUserDefaultsController

Несмотря на то, что NSUserDefaults должен остаться Вашим основным программируемым интерфейсом к пользовательским значениям по умолчанию, некоторые обстоятельства требуют, чтобы Вы получили и установили значения по умолчанию, содержавшиеся в экземпляре NSUserDefaultsController непосредственно. Например, при реализации частей предпочтительного окна, непосредственно не взаимодействующих с существующей привязкой, такой как установка шрифта или выбор пути к каталогу.

Метод NSUserDefaultsController values возвращает KVC-совместимый объект, использующийся для доступа к этим значениям по умолчанию. Для получения значения значения по умолчанию используйте valueForKey: метод.

[[theDefaultsController values] valueForKey:@"userName"];

Точно так же для установки значения для значения по умолчанию использовать setValue:forKey:.

[[theDefaultsController values] setValue:newUserName
                                 forKey:@"userName"];

NSUserDefaultsController автоматически обеспечивает, уведомление о значении изменяются на любую установленную привязку для того ключевого пути.