Реализация простой предпочтительной области

Этот раздел берет Вас через шаги для создания простой предпочтительной области, взаимодействующей с системой пользовательской настройки. Предпочтительная область хранит и получает пару использования значений Core Foundation Preference Services. Если Вы уже создали скелетную предпочтительную область, как описано в Создании Предпочтительного Пакета Области, можно использовать его здесь. Или, можно создать новую предпочтительную область и обратиться к следующим инструкциям, где это необходимо.

Создайте пользовательский интерфейс

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

  1. Откройте файл пера в Интерфейсном Разработчике.

  2. Перетащите текстовое поле в окно. Маркируйте поле «A string value».

  3. Перетащите флажок в окно. Измените его метку на “Булево значение”.

  4. В области Classes главного окна выберите свой предпочтительный подкласс области.

  5. В области Attributes окна Info добавьте два названные выхода theTextField и theCheckbox.

  6. Добавьте названное действие checkboxClicked:.

  7. В области Instances главного окна сделайте соединения между объектом Владельца Файла (представление Вашего предпочтительного подкласса области) и текстовым полем и флажком, подключив их с theTextField и theCheckbox выходы.

  8. Сделайте соединение между флажком и объектом Владельца Файла, соединившись checkboxClicked: целевой метод действия.

  9. Сохраните файл пера.

  10. С Вашим подклассом, выделенным в области Classes, выберите Create Files из меню Classes. Сохраните файлы в свой проект, перезаписав при необходимости.

Обновите заголовочный файл

Предпочтительный заголовок области по умолчанию, создаваемый Интерфейсным Разработчиком, требует нескольких дополнений.

  1. В XCode выберите предпочтительный заголовочный файл области.

  2. После импорта строки Cocoa.h добавьте строки

    #import <PreferencePanes/NSPreferencePane.h>
    #import <CoreFoundation/CoreFoundation.h>
  3. Обновите объявления выхода, чтобы быть

    IBOutlet NSButton    *theCheckbox;
    IBOutlet NSTextField *theTextField;
  4. Добавьте новую переменную экземпляра для содержания идентификатора приложения целевого приложения:

    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);
}