У меня есть табличное представление, ячейки которого расширяются при выборе. Это делается путем изменения высоты ячейки в блоке executeBatchUpdates внутри didSelectRowAt. Когда ячейка развернута, раскрываются ее дочерние виды, поле и кнопка. Проблема в том, что идентификаторы доступности для этих дочерних элементов не выбираются механизмом доступности. Что не только делает приложение менее доступным, но и означает, что мои XCUITests, которые пытаются найти эти элементы, используя их идентификаторы, терпят неудачу.
В настоящее время я нашел единственный способ сделать идентификаторы доступности видимыми для механизма специальных возможностей - это вызвать tableView.reloadData () после завершения анимации. Однако это не идеально, так как в противном случае плавная анимация выглядит глючно. Я попытался также использовать UIAccessibility.post (.layoutChanged, nextElement), но это не помогло. Я попытался включить и выключить isAccessibilityElement, когда дети не видны.
В View Debugger идентификаторы доступности представлены для дочерних элементов, и они сообщаются как элементы доступности. Тем не менее, механизм доступности еще не может подобрать их. Поэтому мой вопрос: как я могу сделать эти элементы видимыми для механизма доступности после анимации ячеек?
упрощенный код:
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 ().