Как заставить сбросить идентификаторы доступности в табличном представлении после анимации? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть табличное представление, ячейки которого расширяются при выборе. Это делается путем изменения высоты ячейки в блоке 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 ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...