#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
экземпляра контроллера представления.