自定义UITableViewCell的可访问性

14

如何单独设置UITableViewCells的子视图的可访问性。
它不应该作为完整单元格可访问。


你能告诉我们你已经尝试过什么了吗? - Mack
@Mack:我已经尝试过禁用单元格可访问性并启用子视图可访问性。 - SwapnilN
@SwapnilN,在tableView(_:cellForRowAt:)中完成,而不是在你自定义的单元格的init(style:reuseIdentifier:)方法中。请参考这个答案 - ma11hew28
4个回答

19

如果您的tableview单元格仅包含文本,则启用单元格的可访问性即可,它将读出整个单元格。如果您有其他对象和按钮,则建议使用UITableViewCell的子类,并覆盖-accessibilityElements方法以返回所有可访问元素。

一些代码:

#import "CustomCell.h"

@implementation CustomCell

- (void)awakeFromNib
{
    [super awakeFromNib];
    self.accessibilityElements = @[self.view1, self.label, self.imageView];
}

以下帖子可能有所帮助:

http://cocoacaffeine.wordpress.com/2013/11/29/little-tricks-of-accessibility/


也非常有用于UITesting... 可以使用辅助检查器找到元素,但UITest找不到该元素。这解决了问题。 - inf1783

9
tableView(_:cellForRowAt:) 方法中,使单元格无法访问并使其子视图可访问。
isAccessibilityElement = false
mySubview1.isAccessibilityElement = true
mySubview2.isAccessibilityElement = true
mySubview3.isAccessibilityElement = true

我也遇到了这个问题,因为我(试图提高效率)将上述代码放在我的自定义单元格的 init(style:reuseIdentifier:) 方法中。但是,这并没有起作用,可能是因为 UITableView 在初始化每个单元格后会重置所有东西。
相关参考:iOS 辅助功能编程指南:增强表视图的辅助功能

在您的情况下,单元格是在故事板或nib中创建的吗?如果是这样,您需要将该代码放入init?(coder:)中,我认为它应该可以工作。当单元格从故事板或nib中创建时,不会调用init(style:reuseIdentifier:)。 - Mobile Dan
我通过编程创建单元格。 - ma11hew28
感谢确认,@mattdipasquale!我想知道在init()方法中设置可访问性属性是否有问题。我在另一个问题的答案中提到了在init()中设置可访问性作为建议解决方案之一。我测试了在cell init()中将isAccessibilityElement设置为true的子视图,并没有看到它在单元格最初或回收时丢失。也许我没有测试与您相同的场景。 - Mobile Dan
只是为了明确,我相信这是正确的答案,并且tableView(_:cellForRowAt:)是在单元格上设置可访问性属性的最佳位置。在我的测试中,似乎您还可以在自定义单元格的init()中设置属性。我回答了一个不同的VoiceOver问题,其中解决方案之一包括在init()方法中设置可访问性属性。如果我确认这是有问题的,我将更新那个答案并在此处发布更新。谢谢! - Mobile Dan

5

回答 @ma11hew28 的问题,这里提供另一种方式可以节省一些代码行数。

Swift 5

class ServiceTableViewCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.selectionStyle = .none
        self.isAccessibilityElement = false //not allowing accessibility for the cell itself
        self.accessibilityElements = [mySubview1!, mySubview2!, mySubview3!] // but allowing accessibility in the cell's subviews
    }
}

1
我尝试了这里提出的每个解决方案,但它们都没有解决我的问题。
我成功地隐藏了单元格并仅突出显示UITableViewCell中的元素,方法是将单元格的contentView.accessibilityElementsHidden设置为true,同时将我的UI项目的isAccessibilityElement设置为true。
contentView.accessibilityElementsHidden = true

UIElement.isAccessibilityElement = true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接