ios - VoiceOver 不读取 UITextField subview

标签 ios objective-c uitableview voiceover

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

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

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

很抱歉没有发布任何代码,我真的不确定发布什么代码是相关的,因为我在代码中根本看不到任何与可访问性相关的内容。在 Storyboard 中,它被选为可供我想阅读的所有元素访问,但 UITextFields 似乎忽略了此设置。

最佳答案

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

@implementation MyCustomCellViewClass

-(NSString*)accessibilityLabel {

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

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

使用这种方法确保您的单元具有正确的角色。无论单元格的事件元素是什么(标签、链接、按钮等)都应该是您的 super View 的角色。其他元素仅供引用。

关于ios - VoiceOver 不读取 UITextField subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069334/

相关文章:

ios - 如何阻止 UILabel 将 "..."替换为省略号

ios - 如何水平和垂直居中四个按钮?

ios - Apple Developer - Register an App ID for 下的 'Fonts' 功能是什么?

iphone - IOS 添加右键到导航栏不起作用

ios - 将 UIView 置于 super View spring/struts 中间

ios - 使用 NSUserActivity 和 CoreSpotlight 但仍将 iOS8 设置为部署目标

iphone - 如何在 AppDelegate iPhone 应用程序中使用@protocol?

ios - 根据表中出现的内容重新排序 MutableArray

ios - UITableView InfiniteScrolling 无需在 Swift 中重新加载 TableView

iOS UITableView 单元格布局问题