我正在为我的应用程序添加键盘快捷键。有一个视图控制器呈现另一个控制器:
class ViewController: UIViewController {
override var canBecomeFirstResponder: Bool { true }
override func viewDidLoad() {
super.viewDidLoad()
addKeyCommand(UIKeyCommand(
input: "M",
modifierFlags: .command,
action: #selector(ViewController.handleKeyCommand),
discoverabilityTitle: "Command from the container view"
))
}
@objc func handleKeyCommand() {
present(ModalViewController(), animated: true)
}
override func canPerformAction(
_ action: Selector, withSender sender: Any?
) -> Bool {
if action == #selector(ViewController.handleKeyCommand) {
return isFirstResponder
}
return super.canPerformAction(action, withSender: sender)
}
}
class ModalViewController: UIViewController {
override var canBecomeFirstResponder: Bool { true }
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
addKeyCommand(UIKeyCommand(
input: "D",
modifierFlags: .command,
action: #selector(ModalViewController.handleKeyCommand),
discoverabilityTitle: "Command from the modal view"
))
if !becomeFirstResponder() {
print("⚠️ modal did not become first responder")
}
}
@objc func handleKeyCommand() {
dismiss(animated: true)
}
}
两者都定义了快捷方式。当模态视图控制器被呈现时,Discoverability 弹出窗口包括用于呈现和呈现的视图控制器的快捷方式。直观地说,应该只包含模态视图控制器的快捷方式(我们不应该能够与呈现的视图控制器交互,对吧?)
我可以通过覆盖呈现视图控制器的keyCommands
属性来解决这个问题,但这是个好主意吗?
一般来说,这种行为背后的原因是什么?这是错误还是功能?
更新:添加canPerformAction(_:sender:)
到呈现视图控制器(如@buzzert所建议),但问题仍然存在。