4

这可能很明显,但是我以前从未使用 NSAccessibility 做过任何工作,所以我假设我所问的是我忽略的一些简单的事情。

我有一个 NSTextField 显示这样的持续时间,15:39。此文本字段是基于视图的 NSTableView 中 NSTableCellView 的子视图。

启用 VoiceOver 后,它当前会显示“一五,三九”,这似乎完全没用。相反,我希望它说“持续时间是 15 分 39 秒”。

我可以生成所需的字符串,但我无法弄清楚我必须设置哪些可访问性属性才能实现这一点。

我尝试在 IB 中设置可访问性描述,但没有效果(无论是在 NSTextField 还是 NSTextFieldCell 上设置)。

我还尝试覆盖accessibilityValue:accessibilityAttributeValue:forParameter:以便为以下内容提供自定义属性值:

  • NSAccessibilityNumberOfCharactersAttribute
  • NSAccessibilityStringForRangeParameterizedAttribute
  • NSAccessibilityAttributedStringForRangeParameterizedAttribute
  • NSAccessibilityStringForRangeParameterizedAttribute。

这似乎是正确的轨道,因为这确实允许我替换通过配音大声朗读的内容,但是,为 NSAccessibilityVisibleCharacterRangeAttribute 提供与“15:39”字符串的长度不匹配的任何 NSRange 会导致配音完全跳过当读取 NSTableCellView 的内容时这个字段。所以,我能做的最好的就是让旁白说“Durat”,而不是读出“15:39”:(

我尝试过的一切,我都尝试过 NSTextField 和 NSTextFieldCell。

理想情况下,我更愿意做我在 iOS 中所做的事情,只设置 NSTableCellView 的accessibilityLabel,但我认为在 AppKit 中没有合理的方法可以做到这一点。希望我只是错过了一些东西。

4

3 回答 3

4

我可以通过设置accessibilityValueDescriptionNSTextField 来实现这一点。此方法是 OS X 10.10 及更高版本上新的辅助功能 API 的一部分。使用较旧的 API,您也许可以使用kAXValueDescriptionAttribute来实现相同的事情。

于 2015-12-24T11:47:44.397 回答
1

覆盖 Voice Over 阅读的文本的解决方案比我想象的要简单得多。我所要做的就是覆盖为 NSAccessibilityAttributedStringForRangeParameterizedAttribute 返回的值:

// The displayed text for this text field is "45m".
// The voice over for this field incorrectly reads "forty five meters" instead of "forty five minutes".  
// The following forces it to read "Duration forty five minutes"

-(id)accessibilityAttributeValue:(NSString *)attribute forParameter:(id)parameter {
return ([attribute isEqualToString:NSAccessibilityAttributedStringForRangeParameterizedAttribute])
        ? [[NSAttributedString alloc] initWithString:@"Duration: 45min"];
        : [super accessibilityAttributeValue:attribute forParameter:parameter];
}
于 2013-04-27T15:18:19.240 回答
0

我相信我已经回答了自己的问题,至少足以控制单击表格单元格视图时读取的内容。

通过覆盖accessibilityIsIgnored以在我的NSTableCellView 子类中返回“NO”,我能够通过覆盖单元格的NSAccessibilityTitleAttribute 来准确指定我想要为表格单元格读取的内容。在 b/c 之前我没有尝试过这个,我误解了accessibilityIsIgnored选择器的目的。

accessibilityIsIgnored的文档中:

当询问一个对象的孩子时,不应该包括被忽略的孩子;相反,被忽略的孩子应该被他们自己的未被忽略的孩子所取代

我希望能够准确控制将来读取各个 NSTextField 的内容,但控制整个 NSTableCellView 读取的内容实际上对于我的特定情况是理想的。

于 2013-04-26T00:27:39.507 回答