ios - 如何禁用 Mac Catalyst 应用程序中的默认键盘导航?

标签 ios macos uitableview keyboard-shortcuts mac-catalyst

我注意到,通过按 Mac 键盘上的向上和向下箭头键,我可以在 Mac Catalyst 应用程序中的 UITableView 中单步浏览行。但是,这会干扰我的 View Controller 之一中的现有功能。有办法禁用它吗?

我在 UITableView 中找不到任何对此功能的引用文档。 Human Interface Guidelines for Mac Catalyst 提到“自动支持基本的 Mac 功能,例如……键盘导航”,所以我猜这是一个有意的功能,但我找不到任何进一步的引用或文档。

我在我的应用程序中没有看到任何其他“自动”键盘导航的示例,但理想情况下,Apple 会发布完整的列表,以便我们知道如何使用内置功能,或者在需要时禁用内置功能。

最佳答案

更新截至 2021 年 11 月 6 日

看起来 Apple 一直在改变默认对焦系统的工作方式,而我以前的解决方案不再有效或不需要。

UIKeyCommand 有一个新的 wantsPriorityOverSystemBehavior: Bool 属性,需要将其设置为 true 以便我们的子类接收某些类型的命令,包括箭头键命令。

至少从 Xcode 13.1 和 macOS 11.6(也许更早)开始,我们现在可以简单地将以下内容添加到 UITableViewController 子类中,以使用自定义键盘导航处理替换默认焦点行为:

class TableViewController: UITableViewController {
    override var keyCommands: [UIKeyCommand]? {
        let upArrowCommand = UIKeyCommand(
            input: UIKeyCommand.inputUpArrow,
            modifierFlags: [],
            action: #selector(handleUpArrowKeyPress)
        )
        upArrowCommand.wantsPriorityOverSystemBehavior = true
        
        let downArrowCommand = UIKeyCommand(
            input: UIKeyCommand.inputDownArrow,
            modifierFlags: [],
            action: #selector(handleDownArrowKeyPress)
        )
        downArrowCommand.wantsPriorityOverSystemBehavior = true
        
        return  [
            upArrowCommand,
            downArrowCommand
        ]
    }

    @objc
    func handleUpArrowKeyPress () {
    }

    @objc
    func handleDownArrowKeyPress () {
    }
}

之前的答案(不再有效或不需要)

Catalyst 自动将向上/向下箭头的 UIKeyCommands 分配给 UITableView 实例。 iOS 上不会发生这种情况。您可以通过在 UITableViewControllerviewDidLoad() 中设置断点并检查 tableView.keyCommands 来查看其实际情况。

因此,我创建了一个非常简单的 UITableView 子类,并通过返回 nil 禁用了默认的 keyCommmands:

class KeyCommandDisabledTableView: UITableView {
    override var keyCommands: [UIKeyCommand]? {
        return nil
    }
}

然后我更新了我的 UITableViewController 子类以使用新的 KeyCommandDisabledTableView 子类:

class MyTableViewController: UITableViewController {
    override func loadView() {
        self.view = KeyCommandDisabledTableView(
            frame: .zero, 
            style: .plain // or .grouped
        )
    }
}

瞧!默认的箭头键处理已消失,现在正在调用我的应用程序的自定义箭头键处理。

关于ios - 如何禁用 Mac Catalyst 应用程序中的默认键盘导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61147893/

相关文章:

iphone - 如何在表格 View 内显示表格单元格的详细 View ?

iphone - NSInternalInconsistencyException - 无法加载 bundle : 中的 NIB

ios - 如何在 Obj-C 中解析 JSON

ios - 寻找 IPFW 以外的替代解决方案来降低互联网连接速度

python - cxfreeze 找不到 libpyside-python

ios - 如何隐藏 UITableView 中某些单元格的多选编辑 GUI?

android - React Native - 如何本地化应用名称?

java - GWT_HOME 不存在 (mac 10.8.3)

c - 当结构未正确对齐时,如何访问结构的成员?

ios - 检查 UITableViewCell 是否完全可见的最佳方法