Objective c NSTextField可访问性-如何为画外音提供备用文本
这可能是显而易见的,但我以前从未做过任何关于非可访问性的工作,所以我假设我所问的是一些我忽略的简单问题 我有一个NSTextField,显示这样的持续时间,15:39。此文本字段是基于视图的NSTableView中NSTableCellView的子视图 当画外音被启用时,它现在会显示“一五三九”,这似乎完全没有用。相反,我希望它说“持续时间是15分39秒。” 我可以生成所需的字符串,但我无法确定必须设置哪些可访问性属性才能实现这一点 我尝试在IB中设置可访问性描述,但没有效果(无论是在NSTextField还是NSTextFieldCell上设置) 我还尝试覆盖可访问性值:和可访问性属性值:forParameter:,以便为以下对象提供自定义属性值:Objective c NSTextField可访问性-如何为画外音提供备用文本,objective-c,accessibility,nstextfield,appkit,Objective C,Accessibility,Nstextfield,Appkit,这可能是显而易见的,但我以前从未做过任何关于非可访问性的工作,所以我假设我所问的是一些我忽略的简单问题 我有一个NSTextField,显示这样的持续时间,15:39。此文本字段是基于视图的NSTableView中NSTableCellView的子视图 当画外音被启用时,它现在会显示“一五三九”,这似乎完全没有用。相反,我希望它说“持续时间是15分39秒。” 我可以生成所需的字符串,但我无法确定必须设置哪些可访问性属性才能实现这一点 我尝试在IB中设置可访问性描述,但没有效果(无论是在NSTex
- NSAccessibilityNumberOfCharactersAttribute
- NSAccessibilityStringForRangeParameterizedAttribute
- NSAccessibilityAttributedStringForRangeParameterizedAttribute
- NSAccessibilityStringForRangeParameterizedAttribute李>
理想情况下,我更愿意像在iOS中那样,只设置NSTableCellView的accessibilityLabel,但我在AppKit中看不到这样做的合理方法。希望我只是遗漏了一些东西。我相信我已经回答了自己的问题,至少足以控制单击表格单元格视图时读取的内容 通过覆盖AccessibilitysIgnored返回“否”在我的NSTableCellView子类中,我能够通过覆盖单元格的NSAccessibilityTitleAttribute来准确指定我想要为表格单元格读取的内容。在b/c之前,我没有尝试过这样做,因为我误解了AccessibilityIgnored选择器的用途 从可访问性被忽略的文档中: 请求对象的子对象时,不应包括被忽略的子对象;相反,被忽略的子对象应替换为自己未被忽略的子对象
我希望将来能够准确地控制各个NSTextFields的读取内容,但控制整个NSTableCellView的读取内容实际上非常适合我的特殊情况。覆盖通过画外音读取的文本的解决方案比我想象的要简单得多。我所要做的就是覆盖该值为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];
}
我只需在NSTextField上设置即可实现这一点。此方法是OS X 10.10及更高版本上新的可访问性API的一部分。使用较旧的API,您可能可以使用
kAXValueDescriptionAttribute
实现相同的目标。尽管它可以工作,但这种方法不必要地复杂。有关sim卡,请参阅Quinn的评论这是一个很好的解决方案。