Доступ к предпочтительным значениям

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

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

Предпочтительные значения должны быть одними из стандартных типов объектов списка свойств: NSData, NSString, NSNumber, NSDate, NSArray, или NSDictionary. NSUserDefaults класс также обеспечивает встроенные манипуляции для хранения NSURL объекты как предпочтительные значения. Для получения дополнительной информации о списках свойств и их содержании, см. Руководство по программированию Списка свойств.

Регистрация предпочтений приложения по умолчанию

Во время запуска приложение должно зарегистрировать значения по умолчанию для любых предпочтений, что это ожидает присутствовать и быть допустимым. Когда Вы запрашиваете значение предпочтения, никогда не устанавливавшегося, методы NSUserDefaults значения по умолчанию возврата класса, которые являются подходящими для типа данных. Для числовых скалярных значений это обычно означает возвращаться 0, но для строк и других объектов это означает возвращаться nil. Если эти стандартные значения по умолчанию не являются подходящими для Вашего приложения, можно зарегистрировать собственные значения по умолчанию с помощью registerDefaults: метод. Этот метод помещает Ваши пользовательские значения по умолчанию в NSRegistrationDomain домен, заставляющий их быть возвращенными, когда явно не установлено предпочтение.

При вызове registerDefaults: метод, необходимо обеспечить словарь всех значений по умолчанию, которые необходимо зарегистрировать. Перечисление 2-1 показывает пример, где приложение для iOS регистрирует свои значения по умолчанию рано в цикле запуска. Вы можете зарегистрировать значения по умолчанию в любое время, конечно, но должны всегда регистрировать их прежде, чем попытаться получить любые предпочтительные значения.

Перечисление 2-1  , Регистрирующее предпочтительные значения по умолчанию

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   // Register the preference defaults early.
    NSDictionary *appDefaults = [NSDictionary
        dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"CacheDataAgressively"];
    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];
 
   // Other initialization...
}

При регистрации значений по умолчанию для скалярных типов используйте NSNumber объект указать значение для числа. Если Вы хотите зарегистрировать предпочтение, значением которого является URL, используйте archivedDataWithRootObject: метод NSKeyedArchiver закодировать URL в NSData объект сначала. Несмотря на то, что можно использовать подобный метод для других типов объектов, необходимо избежать делать поэтому, когда более простая опция доступна.

Получение и установка предпочтительных значений

Вы получаете и устанавливаете предпочтительные значения с помощью методов NSUserDefaults класс. Этот класс имеет методы для получения и установки предпочтений со скалярными значениями булевской переменной типа, integer, float, и double. Это также имеет методы для получения и установки предпочтений, значение которых является объектом типа NSData, NSDate, NSString, NSNumber, NSArray, NSDictionary, и NSURL. Существует две ситуации, где Вы могли бы получить предпочтительные значения и то, где Вы могли бы установить их:

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

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"CacheDataAggressively"]) {
   // Delete the backup file.
}

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

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
if ([cacheAgressivelyButton state] == NSOnState) {
   // The user wants to cache files aggressively.
   [defaults setBool:YES forKey:@"CacheDataAggressively"];
   [defaults setObject:[NSDate dateWithTimeIntervalSinceNow:(3600 * 24 * 7)]
             forKey:@"CacheExpirationDate"]; // Set a 1-week expiration
} else {
    // The user wants to use lazy caching.
   [defaults setBool:NO forKey:@"CacheDataAggressively"];
   [defaults removeObjectForKey:@"CacheExpirationDate"];
}

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

Синхронизация и обнаружение предпочтительных изменений

Поскольку NSUserDefaults значения кэшей класса, иногда необходимо синхронизировать кэшируемые значения с текущим содержанием пользовательской базы данных значений по умолчанию. Ваше приложение является не всегда единственным объектом, изменяющим пользовательскую базу данных значений по умолчанию. В iOS приложение Настроек может изменить значения предпочтений приложений, имеющих пакет Настроек. В OS X система и другие приложения могли бы изменить предпочтительные значения в ответ на пользовательские действия. Например, если пользователь изменяет предпочтенные языки, система пишет новые значения в пользовательскую базу данных значений по умолчанию. В OS X v10.5 и позже, совместно используемое NSUserDefaults объект синхронизирует свои кэши автоматически в периодических интервалах. Однако приложения могут вызвать synchronize метод вручную для принуждения обновления кэшируемых значений.

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

Управление предпочтениями Используя привязку какао

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

Для получения дополнительной информации о том, как использовать NSUserDefaultsController класс для привязки предпочтительных значений с пользовательским интерфейсом посмотрите Пользовательские Значения по умолчанию и Привязку в Привязке Какао, Программируя Темы.

Управление предпочтениями Используя базовую основу

Базовая платформа Основы обеспечивает свой собственный набор интерфейсов для доступа к предпочтениям, сохраненным в пользовательской базе данных значений по умолчанию. Как NSUserDefaults класс, можно использовать Базовые функции Основы, чтобы получить и установить предпочтительные значения и синхронизировать пользовательскую базу данных значений по умолчанию. В отличие от этого NSUserDefaults, можно использовать Базовые функции Основы для записи предпочтений различных приложений и на различных компьютерах. Обратите внимание на то, что изменение некоторых предпочтительных доменов (те, которые не принадлежат текущему приложению и пользователю), требует полномочий пользователя root (или административные привилегии до OS X v10.6); дополнительные сведения о том, как получить подходящие полномочия см. в Руководстве по программированию Authorization Services. Запись вне домена приложения не возможна для приложений, установленных в песочнице.

Для получения информации о Базовых функциях Основы для получения и установки предпочтений, посмотрите Предпочтительную Ссылку Утилит.

Закладывание предпочтительного значения Используя базовую основу

Предпочтения сохранены как пары ключ/значение. Ключ должен быть объектом CFString, но значение может быть любым Базовым значением списка свойств Основы (см., что Список свойств Программирует Темы для Базовой Основы), включая контейнерные типы. Например, Вам можно было бы вызвать ключ defaultWindowWidth это определяет ширину в пикселях любых новых окон, которые создает Ваше приложение. Его значение наиболее вероятно имело бы тип CFNumber. Вы могли бы также решить объединить ширину окна и высоту в единственное вызванное предпочтение defaultWindowSize и заставьте его значение быть объектом CFArray, содержащим два объекта CFNumber.

Код в Перечислении 2-2 демонстрирует, как создать простое предпочтение приложения MyTextEditor. Пример устанавливает цвет текста по умолчанию для приложения к синему.

Перечисление 2-2  Пишущий простое значение по умолчанию

CFStringRef textColorKey = CFSTR("defaultTextColor");
CFStringRef colorBLUE = CFSTR("BLUE");
 
// Set up the preference.
CFPreferencesSetAppValue(textColorKey, colorBLUE,
        kCFPreferencesCurrentApplication);
 
// Write out the preference data.
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);

Заметьте это CFPreferencesSetAppValue отдельно не достаточно для создания нового предпочтения. Вызов к CFPreferencesAppSynchronize требуется, чтобы фактически сохранять значение. Если Вы пишете многократные предпочтения, более эффективно синхронизировать только один раз после того, как последнее значение было установлено, чем синхронизировать после того, как установлено каждое отдельное значение. Например, при реализации предпочтительной области, Вы могли бы синхронизироваться только, когда пользователь нажимает кнопку OK. В других случаях Вы не могли бы хотеть синхронизировать вообще, до выходов приложения — несмотря на то, что примечание это, если сбои приложения, будут потеряны все несохраненные предпочтительные настройки.

Получение предпочтительного значения Используя базовую основу

Самый простой способ расположиться и получить предпочтительное значение состоит в том, чтобы использовать CFPreferencesCopyAppValue функция. Этот вызов перерывает различные предпочтительные домены в порядке, пока это не находит ключ, который Вы указали. Если предпочтение было установлено в менее определенном домене — Каком-либо Приложении, например — его значение получено с этим вызовом, если не может быть найдена более определенная версия. Перечисление 2-3 показывает, как получить предпочтение цвета текста, сохраненное в Перечислении 2-2.

Перечисление 2-3  Читая простое значение по умолчанию

CFStringRef textColorKey = CFSTR("defaultTextColor");
CFStringRef textColor;
 
// Read the preference.
textColor = (CFStringRef)CFPreferencesCopyAppValue(textColorKey,
        kCFPreferencesCurrentApplication);
// When finished with value, you must release it
// CFRelease(textColor);

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