如何在NSTabViewItem上添加VoiceOver



Voiceover通常使用accessibilityRole实例方法实现。我可以在按钮上使用它,例如

button.accessibilityRole = NSLocalizedString(@"Button", nil);

但当我在NSTabViewItem上使用它时,

NSTabViewItem *item0 = [NSTabViewItem tabViewItemWithViewController:self.tab0];
item0.acessibilityRole = NSLocalizedString(@"Tab 0",nil);

我在说时出错

在类型为"NSTabViewItem*"的对象上找不到属性"accessibilityRole">

编辑:我也尝试过accessibilityLabel

accessibilityLabel通常在Views上调用,所以我在NSView上使用了它。

NSView * cellView = [NSView newAutoLayoutView];
cellView.accessibilityLabel = "label";

这里有许多问题。

  1. 主要问题是accessibilityRole是一个方法,您可以重写它来返回对象的角色。您不能以尝试的方式设置角色,只能将NSCell/NSView子类化并返回适当的字符串。但是,在这种情况下,您可能不想这样做,因为:
  2. 您不会从视图或单元格的accessibilityRole属性返回本地化值,而是使用其中一种NSAccessibilityRole类型。更重要的是:
  3. 该角色仅用于提供有关VoiceOver选择的类型的信息。在选项卡视图的情况下,选项卡视图本身的正确角色是NSAccessibilityTabGroupRole,每个选项卡都有NSRadioButtonRoleNSAccessibilityTabButtonSubrole的子例程。当您使用NSTabView时,这将自动发生。注意,您永远不会使用";标签0";,这将标签与角色混为一谈。如果标签有文本标题,你就不需要标签,只有当你有一个带有标题图标的标签时,才需要标签。然后标签将类似于";信息";的图标ℹ️.
  4. 通常,您不应该覆盖视图/单元格上的accessibilityRole,而是实例化要开始的正确类型的对象。例如,您不应该创建一个标准类型为NSButtonTypeMomentaryPushIn的按钮,然后将其角色重写为NSAccessibilityCheckBoxRole,而应该只创建一个复选框。然后将为您正确设置角色/子角色/角色描述。通常,只有在从头开始滚动自己的视图时,才需要覆盖视图上的accessibilityRole
  5. 在按钮或具有单元格的任何其他对象上设置可访问性属性时,不应使用NSView(NSButton实例)。相反,您需要使用NSCell(NSButtonCell,通过button.cell到达)。例如,button.cell.accessibilityLabel = NSLocalizedString("Cancel", nil);虽然许多AX属性是从单元格传递到视图的,但也有少数属性不是。此外,不同的可访问性技术(VoiceControl、VoiceOver、SwitchControl)对此或多或少都很严格。您应该始终在适当的位置设置单元格中的内容,以便与最广泛的AX技术兼容
  6. 确定应用程序应该做什么的最佳方法是在苹果产品中找到一个类似的UI,并使用辅助功能检查器探索AX层次结构

最新更新