VoiceOver 不会宣布 NSAccessibility 通知

VoiceOver won't announce NSAccessibility Notification

我正在努力为现有 macOS 代码库中的自定义 UI 元素添加辅助功能。我们有一个自定义错误 window,它会在错误发生时出现,我正在尝试让 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 参数中放入硬编码字符串值,并尝试使用 .rawValue90 作为 .priority 参数。

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

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

也许这对您也有帮助?

因此,经过反复试验(以及 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
    ]
)