Хранение 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 Интерфейсного Разработчика на представление. Для установления привязки между этим объектом и пользовательскими значениями по умолчанию завершите следующие шаги:
С цветом, хорошо все еще выбранным, откройте область Bindings Инспектора и представьте привязку значения.
От “Связывают со” всплывающим меню, выбирают Shared User Defaults.
Это действие добавляет экземпляр
NSUserDefaultsController
(“Совместно используемые Значения по умолчанию”) к окну файла пера.Сохраните Поле ключа Контроллера как
values
но в Ключевом Поле трактов Модели указывают имя, под которым можно сохранить цветовой объект (theColor
, в этом примере).От выбора поля комбинированного списка Value Transformer (или входят),
NSUnarchiveFromData
.
Когда Вы закончены, Ваша установка в Интерфейсном Разработчике должна выглядеть подобной этому на рисунке 1.
Если в этой точке Вы сохранили свой файл пера и разрабатываете Ваш проект, можно запустить приложение, изменить цвет в цвете хорошо, выйти из приложения, и затем повторно запуститься. Цвет в цвете хорошо - то, чем это было при последнем изменении его.
Несмотря на то, что предшествующая процедура устанавливает привязку между NSColor
значение представления и пользовательских значений по умолчанию, это не распространяет изменения в том значении к другим объектам в приложении. Можно сделать это путем явного выбирания цвета к восстановленному значению по умолчанию, когда приложение запускается и, после того, при наличии первого респондента обрабатывают changeColor:
обменивайтесь сообщениями каждый раз, когда пользователь изменяет цвет. Но можно также использовать привязку так, чтобы любое изменение в цвете оценило, распространен и к пользовательским значениям по умолчанию и применен к пользовательское представление в приложении. Это требует, чтобы Вы завершили следующие шаги:
Объявите
NSColor
свойство пользовательского класса представления.Представьте это свойство как привязку (
exposeBinding:
); сделайте это в методе классаinitialize
.В методе установщика для свойства отправить
setNeedsDisplay:
(илиsetNeedsDisplayInRect:
) кself
после того, как новый цвет сохраняется; это вынуждает представление перерисовать себя в новом цвете.Определите объект контроллера что действия как делегат приложения. Когда приложение заканчивает запускаться, этот объект устанавливает привязку между пользовательским представлением
NSColor
свойство и свойствоNSUserDefaultsController
объект, связанный с цветом хорошо.См. Перечисление 5 для примера этого последнего шага.
Перечисление 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 |