【发布时间】:2017-02-22 13:49:56
【问题描述】:
问题
我希望用户能够通过按 ESC 键来关闭窗口,但在这种特定情况下我无法让它工作,按 ESC 会触发错误声音(“不,你不能这样做” macOS bloop),没有任何反应。
上下文
我正在创建 NSWindowController 的子类,它本身创建 NSViewController 子类的实例并将其设置在视图中。两个控制器都有自己的 xib 文件。
NSWindowController:
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
}
}
我尝试过的
我假设我的问题是 MyWindowController NSWindow 是 .initialFirstResponder,而我希望 targetView(一个 NSTableView)的内容成为第一响应者 - 这样我可以使用keyDown,我猜,然后从那里将关闭命令发送到窗口。不过,这似乎并不理想。
我尝试通过在 MyWindowController 的 windowDidLoad 中使用 window?.makeFirstResponder(theView) 来强制视图控制器视图成为第一响应者,但没有任何改变。
我也尝试将其添加到 MyWindowController:
override func cancelOperation(_ sender: Any?) {
print("yeah, let's close!")
}
但这只有在用户首先点击窗口背景时才有效,然后按 ESC,它仍然会发出错误声音。这实际上是让我认为问题在于第一响应者在窗口上的原因。
问题
您将如何实现这一目标?当然,我知道用户已经可以用 CMD+W 关闭窗口,但我还是很想解决这个问题。
请注意,代码示例是用 Swift 编写的,但我也可以接受使用 Objective-C 的解释。
【问题讨论】:
-
试试
- (void)cancel:(id)sender。 -
谢谢,但它没有出现在 Xcode 的自动补全 (screenshot) 中。
-
在这种情况下,您可以自己输入或使用
cancelOperation并删除“操作”。 -
@Willeke 哇。有用!我想 Xcode 8 中有一个错误,自动完成应该肯定会显示出来。谢谢!请添加它作为答案。 :)
标签: macos cocoa first-responder nsviewcontroller nswindowcontroller