Как исправить voiceover после удаления строки в TableView

#ios #swift #accessibility #voiceover

#iOS #swift #Специальные возможности #voiceover

Вопрос:

У меня возникли некоторые проблемы с исправлением voiceover после удаления строки. структура такая:

У меня есть tableview с 2 разделами.

  • Первый раздел получил заголовок height = 0 и только одну строку переменной высоты.
  • Второй раздел получил заголовок фиксированной высоты с кнопкой внутри; строк в этих разделах может быть ‘n’. Когда пользователь нажимает кнопку внутри заголовка, ячейка в первом разделе удаляется или вставляется повторно в соответствии с предыдущим состоянием.

В обычном «состоянии» с развернутой ячейкой voiceover работает отлично. Когда пользователь нажимает на кнопку и удаляет строку в первом разделе, voiceover прерывается. Если я просматриваю сверху вниз, все в порядке. Вместо этого при прокрутке вверх vo считывает ячейки, видимые на экране, но читает заголовок первого раздела перед ячейками под ним.

Вставить и удалить довольно просто:

 let indexPath = IndexPath(row: 0, section: 0)
if isExpanded {
   if tableView.contentOffset.y <= 0 {
       tableView.insertRows(at: [indexPath], with: .automatic)
   } else {
       tableView.reloadData()
       tableView.scrollToRow(at: indexPath, at: .top, animated: true)
   }
} else {
   tableView.deleteRows(at: [indexPath], with: .automatic)
}
  

ячейки в каждом разделе имеют: isAccessibilityElement = false

элементом доступности является карточка внутри ячейки, подобная этой:

 cardView.isAccessibilityElement = true
cardView.accessibilityTraits = .button
  

Я был бы очень признателен за вашу помощь, я пробовал разные решения, но ни одно из них не работает. Это в значительной степени головная боль!

Дайте мне знать, если вам нужна дополнительная информация для решения этой проблемы. Спасибо.

Ответ №1:

Решил это, всегда сохраняя строку в первом разделе.

 tableView.performBatchUpdates({
     tableView.deleteRows(at: [indexPath], with: .fade)
     tableView.insertRows(at: [indexPath], with: .fade)
}, completion: nil)
  

Но когда переменная IsExpanded имеет значение false, высота строк в первом разделе устанавливается равной 0 вместо автоматической.

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.section == 0 {
            return isExpanded ? UITableView.automaticDimension : 0
        }
        return UITableView.automaticDimension
    }