Поддержка атрибутов

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

Используя удобный метод поддерживать атрибуты

Версия 10.4 OS X представила accessibilitySetOverrideValue:forAttribute: удобный метод, позволяющий Вам добавлять атрибут или изменять значение существующего атрибута, не разделяя объект доступности на подклассы. Используйте этот метод только для добавления атрибутов и предоставления значений, которые неизменны и принадлежат расположению Вашего приложения, такого как заголовки, описания и ссылки между концептуально связанными элементами.

Не используйте этот метод для добавления атрибутов, которые должны быть устанавливаемыми вспомогательным приложением. Атрибуты Вы добавляете использование accessibilitySetOverrideValue:forAttribute: даже если Вы разделяете объект доступности на подклассы и переопределяете, метод неустанавливаем по умолчанию и останется неустанавливаемым accessibilityIsAttributeSettable: метод. Для получения информации о методах для переопределения для поддержки атрибутов, которые могут быть устанавливаемыми посмотрите Методы переопределения Поддерживать Атрибуты.

Методы переопределения поддерживать атрибуты

NSAccessibility определяет четыре метода для доступа к атрибутам объекта:

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

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

Перечисление 1 показывает реализацию, добавляющую @"MyAttribute" атрибут, инициализируя статическую переменную с массивом названий атрибута в первый раз метод вызывается:

Перечисление 1  , Поддерживающее дополнительный атрибут

static NSString *MyAttributeName = @"MyAttribute";
 
- (NSArray *)accessibilityAttributeNames
{
    static NSArray *attributes = nil;
    if (attributes == nil) {
        attributes = [[[super accessibilityAttributeNames]
                arrayByAddingObject:MyAttributeName] retain];
    }
    return attributes;
}

Когда подкласс поддерживает дополнительный атрибут, он должен также переопределить методы, которые могут получить значение того атрибута, определить, устанавливаемо ли это, и установило свое значение. Перечисление 2 показывает возможные реализации для этих методов, с помощью @"MyAttribute" атрибут добавил в Перечислении 1.

Перечисление 2  , Предоставляющее информацию о добавленном атрибуте

- (id)accessibilityAttributeValue:(NSString *)attribute
{
    // Determine if the attribute being asked about is the newly added one.
    if ( [attribute isEqualToString:MyAttributeName] )
        return [NSNumber numberWithInt:_MyAttribute];
    else
        // The attribute in question is not the added one, so let
        // the superclass handle it.
        return [super accessibilityAttributeValue:attribute];
}
 
- (BOOL)accessibilityIsAttributeSettable:(NSString *)attribute
{
    // Determine if the attribute being asked about is the newly added one.
    if ( [attribute isEqualToString:MyAttributeName] )
        return YES; // YES if MyAttribute is settable, NO if it is not.
    else
        // The attribute in question is not the added one, so let
        // the superclass handle it.
        return [super accessibilityIsAttributeSettable:attribute];
}
 
- (void)accessibilitySetValue:(id)value
                forAttribute:(NSString *)attribute
{
    // Determine if the attribute being asked about is the newly added one.
    if ( [attribute isEqualToString:MyAttributeName] )
        // Call the subclass’s method to set the attribute’s value.
        [self setMyAttributeValue:[value intValue]];
    else
        // The attribute in question is not the added one, so let
        // the superclass handle it.
        [super accessibilitySetValue:value forAttribute:attribute];
}

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