动画后如何在表格视图中强制重置可访问性标识符?

时间:2019-06-26 16:08:08

标签: swift tableview accessibility xcuitest

我有一个表格视图,其中的单元格在选定时会扩展。这是通过更改didSelectRowAt中performBatchUpdates块中的单元格高度来完成的。展开单元格后,将显示其子视图,一个字段和一个按钮。问题是可访问性引擎未获取这些子元素的可访问性标识符。除了使应用程序难以访问之外,这还意味着尝试使用其标识符查找这些元素的XCUITests失败。

目前,我发现使可访问性标识符对可访问性引擎可见的唯一方法是在动画完成后调用tableView.reloadData()。但是,这并不理想,因为它会使原本平滑的动画出现毛刺。我也尝试过使用UIAccessibility.post(.layoutChanged,nextElement),但这没有帮助。当孩子不可见时,我尝试过打开和关闭isAccessibilityElement。

在视图调试器中,为子元素提供了可访问性标识符,并且将其报告为可访问性元素。但是,可访问性引擎仍然无法接收它们。所以我的问题是,在对单元格进行动画处理后,如何使这些元素对可访问性引擎可见?

简化代码:

 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     let item = items[indexPath.row]
            tableView.performBatchUpdates( { 
items.map { $0.setCVVVNotVisible() }       
 item.setCVVVisible()
 }, completion: nil ) 
        }
    }
 override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return items[indexPath.row].isVisible ? 215 : 75
}

在TableViewCell中

outputs
            .displayCVV
            .bind { isVisible in
                DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {

                    self.cvvInputField.accessibilityIdentifier = isVisible ?
                        "payment.card.cvv.field.\(self.index)" : nil
                    self.payButton.accessibilityIdentifier = isVisible ?  "payment.card.pay.button.\(self.index)" : nil
                    self.cvvInputField.isAccessibilityElement = isVisible
                    self.payButton.isAccessibilityElement = isVisible
                    UIAccessibility.post(notification: .layoutChanged, argument: isVisible ? self.cvvInputField : self)

                }
            }

将期望可访问性引擎和XCUITest能够找到payButton和cvvInput字段,因为视图调试器报告它们的标识符已正确设置。但是,可访问性引擎(同时使用可访问性检查器和XCUITests)无法找到这些元素,除非在动画之后对tableview.reloadData()进行了额外的调用。

0 个答案:

没有答案