Реализация простой предпочтительной области
Этот раздел берет Вас через шаги для создания простой предпочтительной области, взаимодействующей с системой пользовательской настройки. Предпочтительная область хранит и получает пару использования значений Core Foundation Preference Services. Если Вы уже создали скелетную предпочтительную область, как описано в Создании Предпочтительного Пакета Области, можно использовать его здесь. Или, можно создать новую предпочтительную область и обратиться к следующим инструкциям, где это необходимо.
Создайте пользовательский интерфейс
Предпочтительная область, создаваемая в этом разделе, состоит из текстового поля и флажка, иллюстрирующего обработку строки и булевых предпочтений.
Откройте файл пера в Интерфейсном Разработчике.
Перетащите текстовое поле в окно. Маркируйте поле «A string value».
Перетащите флажок в окно. Измените его метку на “Булево значение”.
В области Classes главного окна выберите свой предпочтительный подкласс области.
В области Attributes окна Info добавьте два названные выхода
theTextField
иtheCheckbox
.Добавьте названное действие
checkboxClicked:
.В области Instances главного окна сделайте соединения между объектом Владельца Файла (представление Вашего предпочтительного подкласса области) и текстовым полем и флажком, подключив их с
theTextField
иtheCheckbox
выходы.Сделайте соединение между флажком и объектом Владельца Файла, соединившись
checkboxClicked:
целевой метод действия.Сохраните файл пера.
С Вашим подклассом, выделенным в области Classes, выберите Create Files из меню Classes. Сохраните файлы в свой проект, перезаписав при необходимости.
Обновите заголовочный файл
Предпочтительный заголовок области по умолчанию, создаваемый Интерфейсным Разработчиком, требует нескольких дополнений.
В XCode выберите предпочтительный заголовочный файл области.
После импорта строки
Cocoa.h
добавьте строки#import <PreferencePanes/NSPreferencePane.h>
#import <CoreFoundation/CoreFoundation.h>
Обновите объявления выхода, чтобы быть
IBOutlet NSButton *theCheckbox;
IBOutlet NSTextField *theTextField;
Добавьте новую переменную экземпляра для содержания идентификатора приложения целевого приложения:
CFStringRef appID;
Реализуйте initWithBundle: Метод
Предпочтительная область инициализируется с помощью initWithBundle:
метод. Только appID
переменная экземпляра должна быть инициализирована здесь, но при переопределении init
метод, также необходимо вызвать реализацию суперклассов. Добавьте следующий код к предпочтительному файлу реализации области.
- (id)initWithBundle:(NSBundle *)bundle |
{ |
if ( ( self = [super initWithBundle:bundle] ) != nil ) { |
appID = CFSTR(“com.mycompany.example.prefPaneSample”); |
} |
return self; |
} |
Реализуйте mainViewDidLoad Метод
Сразу после того, как файл пера был загружен, объект получает a mainViewDidLoad
сообщение от реализации по умолчанию loadMainView
. Здесь необходимо инициализировать элементы пользовательского интерфейса для отражения текущих предпочтительных настроек. Добавьте следующий код к файлу реализации.
- (void)mainViewDidLoad |
{ |
CFPropertyListRef value; |
/* Initialize the checkbox */ |
value = CFPreferencesCopyAppValue( CFSTR(“Bool Value Key”), appID ); |
if ( value && CFGetTypeID(value) == CFBooleanGetTypeID() ) { |
[theCheckbox setState:CFBooleanGetValue(value)]; |
} else { |
[theCheckbox setState:NO]; |
} |
if ( value ) CFRelease(value); |
/* Initialize the text field */ |
value = CFPreferencesCopyAppValue( CFSTR(“String Value Key”), appID ); |
if ( value && CFGetTypeID(value) == CFStringGetTypeID() ) { |
[theTextField setStringValue:(NSString *)value]; |
} else { |
[theTextField setStringValue:@””]; |
} |
if ( value ) CFRelease(value); |
} |
Для каждого из этих двух используемых предпочтений, mainViewDidLoad
запрашивает значение предпочтения от Core Foundation Preference Services. Если значение найдено для предпочтения (value
не NULL
) и значение имеет правильный тип данных, предпочтительное значение используется для установки значения надлежащего элемента пользовательского интерфейса. Если значение не существует, оно инициализирует элементы со значениями по умолчанию.
Реализуйте checkboxClicked: Метод
Когда пользователь щелкает по флажку, он отправляет сообщение действия в предпочтительный объект области. checkboxClicked:
метод получает новое состояние флажка и хранит его под именем “Ключ Значения Bool”. Добавьте следующий код к файлу реализации; определение пустого метода должно было быть создано Интерфейсным Разработчиком.
- (IBAction)checkboxClicked:(id)sender |
{ |
if ( [sender state] ) |
CFPreferencesSetAppValue( CFSTR(“Bool Value Key”), |
kCFBooleanTrue, appID ); |
else |
CFPreferencesSetAppValue( CFSTR(“Bool Value Key”), |
kCFBooleanFalse, appID ); |
} |
Реализуйте didUnselect Метод
То, когда предпочтительная область является невыбранной, или потому что приложение выходит или другая предпочтительная область, выбрано, это отправляется a didUnselect
сообщение. В этом методе Вы хотите извлечь предпочтения пользователя и сохранить изменения на диск. Так как флажок зарегистрирован каждый раз, когда пользователь щелкает по нему, только текстовое поле должно быть обновлено здесь. После сбрасывания предпочтений к диску, didUnselect
широковещательно передает уведомление. Уведомление предполагает, что целевое приложение реализовано, чтобы получить это уведомление и обновить его предпочтения, в то время как это работает. Добавьте следующий код к файлу реализации.
- (void)didUnselect |
{ |
CFNotificationCenterRef center; |
CFPreferencesSetAppValue( CFSTR(“String Value Key”), |
[theTextField stringValue], appID ); |
CFPreferencesAppSynchronize( appID ); |
center = CFNotificationCenterGetDistributedCenter(); |
CFNotificationCenterPostNotification(center, |
CFSTR(“Preferences Changed”), appID, NULL, TRUE); |
} |