强制NSAccessibility Voiceover读取未关注的OS X文本字段?

时间:2013-08-13 16:22:25

标签: objective-c macos cocoa accessibility voiceover

我有一个按钮,按下时会显示一个“帮助”窗口。

通过orderFrontRegardless显示此窗口,但没有给出键盘焦点。

该窗口包含一个NSTextView,其中包含帮助文本。

对于有视力障碍的用户,我希望OS X的画外音能够在出现时立即读取该窗口文本视图的内容。

我试图让VoiceOver通过以下方式阅读文本:

NSAccessibilityPostNotification(textView, NSAccessibilityValueChangedNotification);

在我的NSTextView子类中,我覆盖了辅助功能方法:

- (id)accessibilityAttributeValue:(NSString *)attribute
{
    //The notification calls this method for attributes:
    //AXRole: returns AXTextArea
    //AXSharedCharacterRange: returns range of the text view

    return [super accessibilityAttributeValue:attribute];
}

通知会导致其查询AXRoleNSAccessibilityRoleAttribute)和AXSharedCharacterRangeNSAccessibilitySharedCharacterRangeAttribute)。

字符范围正确返回文本区域的范围。

但是,AXValueNSAccessibilityValueAttribute)请求不得。这就是我希望VoiceOver读取文本字段时需要的。

为什么NSAccessibilityValueChangedNotification没有请求TextView的NSAccessibilityValueAttribute?如何让VoiceOver读取文本区域的文本?

2 个答案:

答案 0 :(得分:1)

我相信如果不将焦点设置为所需的NSTextView,就无法做到。

我找到了一个使用iOS的解决方案,可以在这个OSX应用程序中实现:VoiceOver: force an accessibility element to be selected after a screen transition

  

在iOS中,您可以在发布时传入辅助功能元素   UIAccessibilityLayoutChangedNotification或   UIAccessibilityScreenChangedNotification作为第二个参数   UIAccessibilityPostNotification和VoiceOver将专注于此   元件。

也许您可以使用NSAccessibility框架与NSAccessibilityPostNotification

类似的方法

答案 1 :(得分:0)

覆盖

-(NSArray *)accessibilityAttributeNames
{
    NSMutableArray *attributeNames = [[super accessibilityAttributeNames] mutableCopy];
    [attributeNames addObject:NSAccessibilityValueAttribute];
    return attributeNames;
}

您是否尝试过NSLog来查找NSAccessibilityValueAttribute是否属于某个属性?