2013-04-24 52 views
3

這可能很明顯,但我從來沒有做過NSAccessibility的任何工作,所以我假設我所要求的是我忽略的一些簡單內容。NSTextField輔助功能 - 如何爲配音提供替代文本

我有一個NSTextField顯示這樣的持續時間,15:39。該文本字段是基於視圖的NSTableView中NSTableCellView的子視圖。

當VoiceOver啓用時,它當前會讀取「一個五,三個九」,這看起來完全沒用。相反,我想讓它說「持續時間是15分39秒」。

我可以產生所需的字符串,但我不知道我必須設置哪些可訪問性屬性來實現此目的。

我已經嘗試在IB中設置輔助功能描述,它沒有任何作用(無論是將它設置在NSTextField還是NSTextFieldCell上)。

我也試着重寫accessibilityValue:爲了提供自定義屬性值

  • NSAccessibilityNumberOfCharactersAttribute
  • NSAccessibilityStringForRangeParameterizedAttribute
  • NSAccessibilityAttributedStringForRangeParameterizedAttribute
  • NSAccessibilityStrin和accessibilityAttributeValue:forParameter gForRangeParameterizedAttribute。

這似乎是在正確的軌道,因爲,它讓我代替什麼是大聲的聲音了,但是閱讀,提供任何NSRange爲NSAccessibilityVisibleCharacterRangeAttribute不匹配「15:39」字符串的長度在讀取NSTableCellView的內容時導致語音完全跳過此字段。所以,我所能做的最好的事情就是讓Voice過來說「Durat」,而不是閱讀「15:39」:(

我試過的一切,我試過NSTextField和NSTextFieldCell。

理想情況下,我更願意做什麼,我會在iOS版和剛剛成立的NSTableCellView的accessibilityLabel,但我看到了AppKit這樣做的合理途徑。希望我只是失去了一些東西。

回答

2

我可以簡單地通過在設定的NSTextField accessibilityValueDescription實現這一目標。此方法是OS X 10.10及更高版本上的新Accessibility API的一部分。使用舊的API,您可以使用kAXValueDescriptionAttribute來實現同樣的目的。

0

我相信我已經回答了我自己的問題,至少足以控制在單擊表格單元格視圖時讀取的內容。

重寫accessibilityIsIoredored在我的NSTableCellView子類中返回「NO」我能夠通過覆蓋單元格的NSAccessibilityTitleAttribute來準確指定我想要讀取表格單元格的內容。我之前沒有在b/c上試過這個,我誤解了accessibilityIsIldored選擇器的用途。

文檔accessibilityIsIgnored

當詢問對象的孩子,忽略孩子不應該被包括在內;相反,被忽略的孩子應該被他們自己的無名孩子所取代。

我希望能夠控制到底是什麼讀出對未來個人NSTextFields,但控制什麼是讀出了整個NSTableCellView實際上是非常適合我的特殊情況。

0

覆蓋由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]; 
} 
+1

雖然有效,但這種方法不必要的複雜。請參閱Quinn對簡單解決方案的評論。 – 2016-06-15 09:50:21