自 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
)
}
}
等等!默认箭头键处理已消失,现在正在调用我的应用的自定义箭头键处理。