Issue
我希望用户能够通过按 ESC 键来关闭窗口,但在这种特定情况下我无法让它工作,按 ESC 会触发错误声音(“不,你不能这样做”macOS bloop)但什么也没发生。
Context
我正在创建 NSWindowController 的子类,它本身创建 NSViewController 子类的实例并将其设置在视图中。两个控制器都有自己的 xib 文件。
NSWindow控制器:
final class MyWindowController: NSWindowController, NSWindowDelegate {
@IBOutlet weak var targetView: MainView!
let myVC: MyViewController!
var params: SomeParams!
override func windowDidLoad() {
super.windowDidLoad()
myVC = MyViewController(someParams: params)
myVC.view.setFrameSize(targetView.frame.size)
myVC.view.setBoundsSize(targetView.bounds.size)
targetView.addSubview(myVC.view)
}
override var windowNibName: String! {
return "MyWindowController"
}
convenience init(someParams params: SomeType) {
self.init(window: nil)
self.params = params
}
}
NSViewController:
final class MyViewController: NSViewController {
convenience init(someParams params: SomeType) {
// do stuff with the params
}
override func viewDidLoad() {
super.viewDidLoad()
// configure stuff for the window
}
}
我尝试过的
I suppose我的问题是 MyWindowController NSWindow 是.initialFirstResponder
当我想要的内容时targetView
(一个 NSTableView)成为第一个响应者 - 这样我可以使用keyDown
,我猜,然后从那里向窗口发送关闭命令。但这似乎并不是最佳选择。
我尝试通过使用强制视图控制器视图成为第一响应者window?.makeFirstResponder(theView)
在 MyWindowController 的 windowDidLoad 中,但没有任何变化。
我还尝试将其添加到 MyWindowController 中:
override func cancelOperation(_ sender: Any?) {
print("yeah, let's close!")
}
但这仅有效如果用户首先单击窗口的背景然后按ESC,仍然发出错误声音。这实际上让我认为问题在于第一响应者在窗口上。
Question
你将如何实现这一目标?当然,我知道用户已经可以使用 CMD+W 关闭窗口,但我仍然想解决这个问题。
请注意,代码示例是用 Swift 编写的,但我也可以接受使用 Objective-C 的解释。