在iOS中使用Voice Over时,调用UIAccessibility.post(notification:argument:)宣布字段错误实际上并没有宣布该错误。

我有一个提交按钮,当聚焦按钮时,旁白会如您所愿地读取按钮标题。按下按钮时,旁白会再次读取标题。当按下提交按钮时,我正在做一些验证,并且当出现字段错误时,我试图通过调用以下命令来宣布它:

if UIAccessibility.isVoiceOverRunning {
    UIAccessibility.post(notification: .announcement, argument: "my field error")
}

有趣的是,如果我在调试器中的断点处停止,则会发生公告。当我不停在断点上时,通知就不会发生。

该通知是在主线程上发布的,如果像NotificationCenter.default一样,我假设它是在与该线程相同的线程上处理的。我已经尝试将调用分派(dispatch)到主队列,即使它已经在主线程上了,这似乎也不起作用。

我唯一能想到的是,在画外音完成读取提交按钮标题之前,通知已发布并已被观察,并且公告通知不会中断当前的画外音。

我真的很感谢在此方面的任何帮助。

最佳答案

这是一个公认的hacky解决方案,但是我可以通过稍微延迟一些时间分配到主线程来防止系统公告抢占我自己的权限:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
  UIAccessibility.post(notification: .announcement, argument: "<Your text>")
}

关于ios - 为什么UIAccessibility.post(notification : .公告,参数: "arg") not announced in voice over?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55522345/

10-10 21:08