【发布时间】:2012-10-19 00:38:53
【问题描述】:
有谁知道防止转义键关闭NSPanel 的最佳方法?我的面板是一个子窗口,我希望它的行为更像是窗口的半永久性部分,更像是一个抽屉,对于其中的文本控件,我想让 Escape 键取消编辑。
我最近在 Cocoa 文档中找到了有关 windows 和 Escape 键的更多信息。在cancelOperation: 下的 NSResponder 类引用中,它说“窗口将cancelOperation: 的默认操作消息发送给第一响应者,然后消息从那里向上传播到响应者链”。 NSPanel 似乎有所不同,并且在没有第一响应者获得 cancelOperation: 调用或 NSTextView 代表获得 doCommandBySelector: 调用的情况下,窗口关闭。
考虑到我一直在做 OS X 工作,我对响应者链的进出的了解是可耻的。我在想我需要在我的NSPanel 子类中使keyDown: 表现得像普通窗口一样。我尝试覆盖NSPanel 并且可以捕获keyDown:,将呼叫转发到NSWindow 的keyDown: 而不是super,但是没有任何变化,Escape 仍然关闭了窗口,没有消息给第一响应者。尝试这样做是否合理?
然后我尝试完全重新实现我的面板子类'keyDown:,让它这样做:
[self.firstResponder cancelOperation:self]
我认为这会让我的文本字段按照它通常期望的方式处理转义,并且如果没有文本字段是第一响应者,那么呼叫将结束。但是,我试过了,面板就像以前一样简单地关闭了。显然我没有在正确的水平上拦截东西。
有谁知道在低级按键事件和面板关闭之间运行的方法序列,或者我需要重写以拦截它并确保cancelOperation: 到达我的第一响应者?
【问题讨论】:
标签: cocoa nswindow nspanel responder-chain