VoiceOver不会宣布NSAccessibility通知

时间:2019-07-15 18:14:17

标签: swift macos accessibility appkit voiceover

我正在努力为现有macOS代码库中的自定义UI元素添加可访问性。我们有一个自定义错误窗口,当发生错误时会出现该窗口,我正在尝试让VoiceOver在发生错误时宣布错误。

当前,我正在尝试使用NSAccessibility.post(element: Any, notification: NSAccessibility.Notification, userInfo: [NSAccessibility.NotificationUserInfoKey : Any]?)方法,但是在运行代码时,不会说出通知。

这是我目前在NSViewController中得到的内容:

NSAccessibility.post(element: self, notification: .announcementRequested, userInfo: [
    .announcement: NSLocalizedString("CANT_CONNECT_ERROR", comment: "Error string for connection failure"),
    .priority: NSAccessibilityPriorityLevel.high
])

我的期望是,使用.announcementRequested选项,VoiceOver应该会自动接听并说出宣布,但没有运气。我尝试使用不同的通知类型,尝试在.announcement参数中输入硬编码的字符串值,并尝试对.rawValue参数使用90.priority

2 个答案:

答案 0 :(得分:0)

Accessibility-Dev邮件列表上的旧对话表明,此通知可能需要定向到NSApp的mainWindow:

https://lists.apple.com/archives/accessibility-dev/2013/Jul/msg00027.html

也许这也会为您解决问题?

答案 1 :(得分:0)

因此,在经过反复试验(和danielpunkass的有用评论)之后,我终于弄清楚了如何使它工作。 YMMV,但这是我的工作方式:

  1. element参数必须设置为NSApp.mainWindow(我还添加了as Any来使编译器警告静音)
  2. userInfo字典中的优先级必须使用.rawValue来设置,而不是实际的枚举值。 Apple's documentation当然没有提到这一点。

这是我的工作代码:

NSAccessibility.post(
    element: NSApp.mainWindow as Any,
    notification: .announcementRequested,
    userInfo: [
        .announcement: "This is a custom accessibility notification",
        .priority: NSAccessibilityPriorityLevel.high.rawValue
    ]
)