VoiceOver 不读取 UITextField 子视图

VoiceOver not reading UITextField subviews

我有一些自定义的 UITableViewCells 可以访问。我试图让 VoiceOver 在点击单元格时阅读所有子视图。根据我的理解,这是你在使用或子类化 UITableViewCell 时免费获得的东西(如果我错了请纠正我。)

问题出在我的几个单元格中。在我的大多数单元格中,一切都正确读取。但是,当我点击包含 UITextField(或 UITextField 的子类)的单元格时,它不会读取 UITextField。它将读取所有其他元素(除了一个单元格上的 UIButton 之外),但会跳过文本字段。

有谁知道它不读取 UITextFields 的任何原因?还有一个 UIButton?是否需要做一些特别的事情才能让这些人阅读?或者我还没有对 UITableViewCell 子类做一些特殊的事情?

抱歉 post 没有代码,我不太确定什么代码与 post 相关,因为我在代码中根本看不到任何与辅助功能相关的内容。在情节提要中,它被选择为可访问我想阅读的所有元素,但 UITextFields 似乎忽略了此设置。

假设您的 table 单元格有 4 个元素:标签、按钮、文本字段和图像视图。所有这些元素都在 table 单元格的 contentView 中。

为了确保旁白读出您 table 单元格中的所有 4 个元素,您需要告诉旁白您的 contentview 包含 4 个 elements.You 可以通过将 contentView 中的所有元素添加到 contentViewaccessibilityElements 数组中。

 contentView.accessibilityElements=@[label,button,textField,imageView];

那么画外音就不会跳过这4个元素中的任何一个

您要做的是创建自定义单元格 class,并覆盖该 class 的 accessibilityLabel 属性。收集所有子视图的可访问性标签。我现在在 windows 机器上,所以如果这不能完全编译,请原谅,但你应该明白了。

@implementation MyCustomCellViewClass

-(NSString*)accessibilityLabel {

    NSMutableString* result = [NSMutableString new];
    for (subview in [view accessibilityElementViews]) {
        [result append:subview.accessibilityLabel];
    }
    return result;
}

通过将此作为 属性 覆盖,而不是在它更改的所有潜在点设置可访问性标签,您消除了未来开发人员覆盖此行为的担忧。您还可以自动处理这些单元格中的动态元素,因为可访问性标签将简单地与子视图的可访问性信息保持同步。然后,您可以将此 class 作为任何未来子 class 的父 class 包括在内,以简单地维护此行为。如果你的任何开发人员愚蠢到从继承树中删除这个子class,你就有更大的问题要处理!

使用这种方法确保您的单元具有正确的角色。无论单元格的活动元素是什么(标签、link、按钮等)都应该是您的超级视图的角色。其他元素仅供参考。