Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSTextField可访问性-如何为画外音提供备用文本_Objective C_Accessibility_Nstextfield_Appkit - Fatal编程技术网

Objective c NSTextField可访问性-如何为画外音提供备用文本

Objective c NSTextField可访问性-如何为画外音提供备用文本,objective-c,accessibility,nstextfield,appkit,Objective C,Accessibility,Nstextfield,Appkit,这可能是显而易见的,但我以前从未做过任何关于非可访问性的工作,所以我假设我所问的是一些我忽略的简单问题 我有一个NSTextField,显示这样的持续时间,15:39。此文本字段是基于视图的NSTableView中NSTableCellView的子视图 当画外音被启用时,它现在会显示“一五三九”,这似乎完全没有用。相反,我希望它说“持续时间是15分39秒。” 我可以生成所需的字符串,但我无法确定必须设置哪些可访问性属性才能实现这一点 我尝试在IB中设置可访问性描述,但没有效果(无论是在NSTex

这可能是显而易见的,但我以前从未做过任何关于非可访问性的工作,所以我假设我所问的是一些我忽略的简单问题

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

当画外音被启用时,它现在会显示“一五三九”,这似乎完全没有用。相反,我希望它说“持续时间是15分39秒。”

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

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

我还尝试覆盖可访问性值:可访问性属性值:forParameter:,以便为以下对象提供自定义属性值:

  • NSAccessibilityNumberOfCharactersAttribute
  • NSAccessibilityStringForRangeParameterizedAttribute
  • NSAccessibilityAttributedStringForRangeParameterizedAttribute
  • NSAccessibilityStringForRangeParameterizedAttribute
这似乎是正确的,因为这确实允许我替换voice over朗读的内容,但是,为NSAccessibilityVisibleCharacterRangeAttribute提供任何与“15:39”字符串长度不匹配的NSRange会导致voice over在读取NSTableCellView的内容时完全跳过此字段。所以,我能做的最好的事情就是让画外音说“Durat”,而不是读“15:39”:(

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


理想情况下,我更愿意像在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的评论这是一个很好的解决方案。