Доступность UI — при отклонении другого представления установите фокус на предыдущий элемент доступности

#ios #swift #uiaccessibility

#iOS #swift #доступность ui

Вопрос:

Я внедряю доступность в наш текущий проект, и у меня возникли некоторые проблемы с настройкой фокуса на элемент в предыдущем viewcontroller.

Примером может быть:

Пользователь выбирает ячейку tableview с индексом 3. В didSelectRowAt мы представляем пользователю a UIActionSheet , где пользователь делает выбор. Как только пользователь сделает выбор и представленный UIActionSheet элемент будет отклонен, фокус доступности ДОЛЖЕН быть выбран в индексе ячейки tableview 3, но вместо этого фокус возвращается к исходному элементу в представлении, в моем случае к самому верхнему левому элементу.

Я использовал UIAccessibility.Notification .screenChanged и UIView.accessibilityViewIsModal для установки нового фокуса при представлении модального представления, но, похоже, это не является хорошим решением для возврата к предыдущему элементу при отклонении представления.

Любая информация о том, как отслеживать предыдущий фокус элемента доступности, была бы весьма признательна.

Ответ №1:

Сначала создайте переменную, которая сохранит предыдущую позицию в TableViewController :

 var previousPosition: IndexPath?
  

Затем сохраните эту позицию после нажатия на ячейку:

 override func tableView(_ tableView: UITableView,
                        didSelectRowAt indexPath: IndexPath) {

    previousPosition = indexPath
}
  

Наконец, когда представленный UIActionSheet элемент будет отклонен (пример кнопки возврата ниже), следующий фрагмент кода выбирает и фокусирует ячейку табличного представления, из которой было запущено последнее нажатие:

 var actionSheet: UIAlertController?

actionSheet = UIAlertController(title: "Action Sheet",
                                message: "Ready to go back?",
                                preferredStyle: .actionSheet)

let backButton = UIAlertAction(title: "B.A.C.K.",
                               style: .cancel,
                               handler: { (action) -> Void in

        print("Back button tapped")

        self.tableView.selectRow(at: self.previousPosition,
                                 animated: true,
                                 scrollPosition: .none)

       let currentCell = self.tableView.cellForRow(at: self.previousPosition!)

       UIAccessibility.post(notification:.layoutChanged,
                            argument: currentCell)
})

actionSheet!.addAction(backButton)
  

Проверьте результат этого фрагмента кода в пустом проекте и адаптируйте его в своем приложении, чтобы он работал по желанию.

РЕДАКТИРОВАТЬ: помимо моего фрагмента кода, взгляните на свойство remembersLastFocusedIndexPath экземпляра табличного представления, которое может обеспечить прямой результат в сочетании со свойством restoresFocusAfterTransition экземпляра контроллера представления.