VoiceOver无法读取UITextField子视图

我有一些我可以访问的自定义UITableViewCells . 我试图让VoiceOver在点击单元格时读取所有子视图 . 根据我的理解,这是您在使用或转发UITableViewCell时免费获得的内容(如果我错了,请纠正我 . )

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

有谁知道它不会读取UITextFields的任何原因?还有一个UIButton?对于那些需要阅读的人来说,有什么特别需要做的吗?或者我还没有做过特殊的UITableViewCell子类?

很抱歉没有发布任何代码,我不确定哪些代码与发布相关,因为我在代码中根本没有看到任何与可访问性相关的内容 . 在故事板中,它被选择为我想要读取的所有元素都可访问,但是UITextFields似乎忽略了这个设置 .

回答(2)

2 years ago

您要做的是创建自定义单元类,并覆盖该类的accessibilityLabel属性 . 收集所有子视图辅助功能标签 . 我现在正在使用Windows机器,所以请原谅,如果这不能完全编译,但你应该明白这个想法 .

@implementation MyCustomCellViewClass

-(NSString*)accessibilityLabel {

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

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

确保使用此方法,您的单元格具有正确的角色 . 无论单元格的活动元素是什么(无论是标签,链接,按钮等)都应该是您的超级视图的角色 . 其他元素只是提供信息 .

2 years ago

假设您的表格单元格有4个元素,一个标签,一个按钮,一个文本字段,一个图像视图 . 所有这些元素都在您的tablecell的 contentView 中 .

为了确保语音翻转读取表格单元格中的所有4个元素,您需要告诉您 contentview 包含4个元素的声音 . 您可以通过将 contentView 中的所有元素添加到 contentViewaccessibilityElements 数组中来实现此目的 .

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

然后,配音不会跳过这4个元素中的任何一个 .