UIAccessibility - 关闭另一个视图时,将焦点设置到上一个可访问性元素

UIAccessibility - When dismissing another view, set focus to previous accessibility element

我正在为我们当前的项目实现可访问性,并且在将焦点设置在之前的一个元素上时遇到一些问题 viewcontroller。

例如:

用户在索引 3 处的表格视图单元格上进行选择。在 didSelectRowAt 中,我们向用户呈现 UIActionSheet,用户可以在其中进行选择。一旦用户做出选择并且呈现的 UIActionSheet 被取消,辅助功能焦点应该在 tableview 单元格索引 3 处被选择,而是焦点被设置回视图中的初始元素,在我的例子中是最上面的 -左元素。

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

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

首先,创建一个变量来存储 TableViewController 中的前一个位置:

var previousPosition: IndexPath?

然后,点击单元格后存储此位置:

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

    previousPosition = indexPath
}

最后,当呈现的 UIActionSheet 被关闭时 (后退按钮示例),以下代码片段选择并聚焦 table 视图最近触发点击的单元格:

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 instance property of the table view that may provide the direct result in conjunction with the restoresFocusAfterTransition 实例 属性视图控制器。