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

Часто желательно сохранить значение экземпляра NSColor в пользовательских значениях по умолчанию приложения. Однако NSUserDefaults только поддерживает хранение объектов, которые могут быть представлены в списке свойств.

Решение состоит в том, чтобы использовать архивацию объекта, чтобы записать данные экземпляра NSColor в экземпляр NSData и затем сохранить это как значение по умолчанию как показано в Перечислении 1. Это часто делается в точке выхода жизненного цикла приложения такой как applicationShouldTerminate: метод делегации.

Перечисление 1  , Хранящее экземпляр NSColor в пользовательских значениях по умолчанию

// store the value in aColor in user defaults
// as the value for key aKey
NSData *theData=[NSArchiver archivedDataWithRootObject:aColor];
[[NSUserDefaults standardUserDefaults] setObject:theData forKey:aKey];

Для чтения значения назад из NSUserDefaults, приложение получает экземпляр NSData для требуемого ключа и разархивировало экземпляр NSColor. Пример в Перечислении 2 демонстрирует получение цвета. Это часто делается в точке входа жизненного цикла приложения такой как awakeFromNib.

Перечисление 2  , Получающее экземпляр NSColor от пользовательских значений по умолчанию

// read the value of the user default with key aKey
// and return it in aColor
NSColor * aColor =nil;
NSData *theData=[[NSUserDefaults standardUserDefaults] dataForKey:aKey];
if (theData != nil)
    aColor =(NSColor *)[NSUnarchiver unarchiveObjectWithData:theData];

Расширение NSUserDefaults для поддержки NSColor

Возможно использовать в своих интересах поддержку категорий в Objective C для добавления поддержки NSColor существующему классу NSUserDefaults без разделения на подклассы.

Пример кода в Перечислении 3 и Перечислении 4 показывает реализацию такой категории. Метод setColor:forKey: в архивах указанный цвет к экземпляру NSData и хранилищам это в пользовательских значениях по умолчанию с помощью указанного ключа. Метод colorForKey: получает экземпляр NSData, указанный ключом, и затем разархивировал экземпляр NSColor использование данных.

  Содержание перечисления 3 категории NSUserDefaults myColorSupport .h файл

#import <Foundation/Foundation.h>
 
@interface NSUserDefaults(myColorSupport)
- (void)setColor:(NSColor *)aColor forKey:(NSString *)aKey;
- (NSColor *)colorForKey:(NSString *)aKey;
@end

  Содержание перечисления 4 категории NSUserDefaults myColorSupport .m файл

#import "NSUserDefaults+myColorSupport.h"
 
@implementation NSUserDefaults(myColorSupport)
 
- (void)setColor:(NSColor *)aColor forKey:(NSString *)aKey
{
    NSData *theData=[NSArchiver archivedDataWithRootObject:aColor];
    [self setObject:theData forKey:aKey];
}
 
- (NSColor *)colorForKey:(NSString *)aKey
{
    NSColor *theColor=nil;
    NSData *theData=[self dataForKey:aKey];
    if (theData != nil)
        theColor=(NSColor *)[NSUnarchiver unarchiveObjectWithData:theData];
    return theColor;
}
 
@end

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

Можно легко установить привязку между объектом пользовательского интерфейса, значение которого является цветом (т.е. NSColor объект) и пользовательские значения по умолчанию. Когда пользователь выбирает цветовую настройку для чего-то в приложении, обязательных заповедниках и восстанавливает предпочтение через последовательные запуски приложения.

Для осуществления привязки используйте готовый экземпляр NSUnarchiveFromDataTransformerName преобразователь значения в Интерфейсном Разработчике. NSValueTransformer объект обычно преобразовывает объектное значение в двух направлениях: между формой, в которой это выведено на экран и форма, в которой это сохранено. NSUnarchiveFromDataTransformerName преобразователь значения работает путем архивации NSColor объект в NSData возразите и затем, с другой стороны привязки, разархивировав цветовой объект от объекта данных. Для этой трансформации значения для работы архивный объект должен реализовать NSCoding протокол с помощью последовательной архивации — который NSColor делает.

NSColorWell экземпляр является объектом пользовательского интерфейса, значение которого является a NSColor объект. Можно перетащить цветной хорошо объект от палитры Controls Интерфейсного Разработчика на представление. Для установления привязки между этим объектом и пользовательскими значениями по умолчанию завершите следующие шаги:

  1. С цветом, хорошо все еще выбранным, откройте область Bindings Инспектора и представьте привязку значения.

  2. От “Связывают со” всплывающим меню, выбирают Shared User Defaults.

    Это действие добавляет экземпляр NSUserDefaultsController (“Совместно используемые Значения по умолчанию”) к окну файла пера.

  3. Сохраните Поле ключа Контроллера как values но в Ключевом Поле трактов Модели указывают имя, под которым можно сохранить цветовой объект (theColor, в этом примере).

  4. От выбора поля комбинированного списка Value Transformer (или входят), NSUnarchiveFromData.

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

Рисунок 1  , Устанавливающий привязку между NSColor значение и пользовательские значения по умолчанию
Establishing a binding between an NSColor value and user defaults

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

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

Перечисление 5  , Устанавливающее привязку между NSColor свойство и NSUserDefaultsController

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [theColorBox bind:@"backgroundColor" toObject:[NSUserDefaultsController sharedUserDefaultsController]
        withKeyPath:@"values.theColor"
        options:[NSDictionary dictionaryWithObject:NSUnarchiveFromDataTransformerName forKey:NSValueTransformerNameBindingOption]];
}
@end