首页 > 解决方案 > UIAccessibility - 当关闭另一个视图时,将焦点设置到上一个可访问性元素

问题描述

我正在将可访问性实现到我们当前的项目中,并且在将焦点设置在以前的视图控制器中的元素上时遇到了一些问题。

一个例子是:

用户在索引 3 处的 tableview 单元格上进行选择。在didSelectRowAt中,我们向用户呈现UIActionSheet用户进行选择的位置。一旦用户做出选择并且所呈现UIActionSheet的内容被关闭,应在 tableview 单元格索引 3 处选择可访问性焦点,但焦点会设置回视图中的初始元素,在我的情况下是最左上角的元素。

在呈现模态视图时,我使用UIAccessibility.Notification .screenChangedUIView.accessibilityViewIsModal设置了新焦点,但这似乎没有一个很好的解决方案来在关闭视图时指向前一个元素。

任何有关如何跟踪先前可访问性元素焦点的见解将不胜感激。

标签: iosswiftuiaccessibility

解决方案


首先,创建一个变量,将先前的位置存储在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


推荐阅读