我注意到,通过按 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 上不会发生这种情况。您可以通过在 UITableViewController
的 viewDidLoad()
中设置断点并检查 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/