我有一个按钮,可以响应各种鼠标单击(常规单击,右键单击,Ctrl +单击,Option +单击,Command +单击...),以显示不同的弹出菜单。由于VoiceOver用户使用实际的物理鼠标会很烦人,因此我想将它们映射到不同的VoiceOver操作。
但是,我没有得到预期的结果。有人可以帮助我更好地了解我所缺少的吗?这是我到目前为止发现的。
如果我继承NSButton
的子类并覆盖以下函数,则它们可以正常工作。除了一件奇怪的事。如果按vo + command + space弹出可用操作列表,则VoiceOver会说“操作1”而不是“显示菜单”。
override func accessibilityPerformPress() -> Bool {
print("Pressed!")
return true
}
override func accessibilityPerformShowAlternateUI() -> Bool {
print("Show Alternate UI")
return true
}
override func accessibilityPerformShowMenu() -> Bool {
print("Show Menu")
return true
}
在同一个NSButton
子类中,如果我也重写accessibilityCustomActions
函数,则当我按vo + command + space时,“做某事”永远不会出现在可用操作列表中。
override func accessibilityCustomActions() -> [NSAccessibilityCustomAction]? {
let custom = NSAccessibilityCustomAction(name: "Do Something", target: self, selector: #selector(doSomething))
return [custom]
}
@objc func doSomething() -> Bool {
print("Done something.")
return true
}
如果我继承了NSView
而不是NSButton
的子类,并且重写了#1中的相同功能,则一切正常。与第一种情况不同,即使VoiceOver正确地为accessibilityPerformShowMenu
中的操作说“显示菜单”,而不是“操作1”。
在同一NSView
子类中,如果我与accessibilityCustomActions
,accessibilityPerformPress
或accessibilityPerformShowMenu
一起覆盖accessibilityPerformShowAlternateUI
,则“做某事”不会出现在操作列表中。
但是,如果我只是自己覆盖accessibilityCustomActions
而没有accessibilityPerformPress
,accessibilityPerformShowMenu
和accessibilityPerformShowAlternateUI
的话,“做某事”确实会出现在操作列表中。
我尝试创建另一个名为“ Press”的动作,该动作在按下vo + space时会执行相同的操作,并且包含在返回值accessibilityCustomActions
中。但是,Vo + space不会触发该操作。相反,我必须按vo + command + space,然后选择“按”。我猜该动作的名称仅为“ Press”,但实际上并没有连接到vo + space。我不确定如何实际执行特定的自定义操作来响应vo + space。
如果有人可以帮助我将accessibilityCustomActions
以及accessibilityPerformPress
,accessibilityPerformShowMenu
和accessibilityPerformShowAlternateUI
一起实施到NSButton
中,我将不胜感激。
非常感谢!
答案 0 :(得分:0)
问题是您在 NSButton
而不是 NSButtonCell
上覆盖了这些 AX 方法。对于几乎所有与 NSControl
中的可访问性有关的事情,您都需要处理相关的 NSCell
。如果您使用上面编写的自定义操作代码并将其粘贴到按钮使用的 NSButtonCell
的子类中,则它会起作用。