Управление иерархией доступности

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

Любой объект указывает, что это не должно быть видимо к вспомогательным приложениям путем реализации accessibilityIsIgnored метод и возврат YES. Поскольку проигнорированный объект все еще участвует во внутренней родительско-дочерней иерархии, однако, это должно реализовать NSAccessibilityParentAttribute и NSAccessibilityChildrenAttribute атрибуты для обеспечения ссылки между объектами выше и ниже его.

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

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

id NSAccessibilityUnignoredDescendant(id element);
id NSAccessibilityUnignoredAncestor(id element);

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

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

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

Какао также обеспечивает следующие две функции удобства, заменяющие проигнорированные объекты их непроигнорированными дочерними элементами:

NSArray *NSAccessibilityUnignoredChildren(NSArray *originalChildren);
NSArray *NSAccessibilityUnignoredChildrenForOnlyChild(id originalChild);

NSAccessibilityUnignoredChildren функция берет ряд объектов доступности и заменяет любые проигнорированные объекты их дочерними элементами, рекурсивно вызывая при необходимости. NSAccessibilityUnignoredChildrenForOnlyChild функционируйте заменяет единственный дочерний элемент его непроигнорированными дочерними элементами. Это эквивалентно следующему использованию NSAccessibilityUnignoredChildren функция:

NSAccessibilityUnignoredChildren( [NSArray arrayWithObject:originalChild] )

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

Перечисление 1  Возвращая значения атрибута для непроигнорированных дочерних элементов

- (id)accessibilityAttributeValue:(NSString *)attribute
{
    if ( [attribute isEqualToString:NSAccessibilityChildrenAttribute] )
        return NSAccessibilityUnignoredChildren( _children );
 
    else if ( [attribute isEqualToString:NSAccessibilityParentAttribute] )
        return NSAccessibilityUnignoredAncestor( _parent );
 
    else
        return [super accessibilityAttributeValue:attribute];
}

В коде в Перечислении 1 _children и _parent сразу представляют объекты выше и ниже данного объекта, независимо от их проигнорированного состояния. Для объекта NSView, например, это подпредставления и суперпредставление, соответственно.