我的应用程序不是基于文档的,它的唯一窗口由我在应用程序委托代码中实例化的基于xib的自定义NSWindowController
子类管理:
- (void) applicationDidFinishLaunching:(NSNotification*) aNotification
{
_mainWindowController = [MainWindowController new];
// (stored in ivar just to prevent deallocation)
//[_mainWindowController showWindow:self];
// ↕︎ Not sure about the difference between these two... both seem to work.
[[_mainWindowController window] makeKeyAndOrderFront:self];
}
我已将NSClipView
隐藏到"滚动视图中的中心内容" (当它被缩放到小于剪辑视图的大小时,而不是将其固定到左下角),并且还在鼠标拖动等时实现自定义功能。
我的窗口不是无边界的(我认为),所以I am not subclassing NSWindow
。
我已在-acceptsFirstResponder
子类中覆盖-canBecomeKeyView
,-becomeFirstResponder
和NSClipview
(全部返回YES
)。
拖动事件 执行 触发-mouseDown:
等,如果我在那里设置断点,那时的第一个响应者与窗口相同托管我的剪辑视图:[self.window firstResponder]
和[self window]
提供相同的内存地址。
我缺少什么?
我整理了一个复制我的设置的最小项目。
我发现如果我的自定义视图是窗口的主视图,则-keyDown:
被调用没有问题。但是如果我放置一个滚动视图并用我的自定义视图替换它的剪辑视图(为此,我需要将基类从NSView
更改为NSClipView
,当然!),{{1} }不再被触发。
我认为它与-keyDown:
管理事件的方式有关(但是,正如我之前所说,NSScrollView
,-mouseDown:
等似乎未受影响。
我还发现我可以在我的窗口控制器中覆盖-mouseDragged:
,这似乎有效,所以我决定这样做(尽管仍然可以回答) 。此外,由于我试图单独检测shift键(而不是另一个键的修饰符),我宁愿使用:
-keyDown:
...代替- (void) flagsChanged:(NSEvent *) event
{
if ([event modifierFlags] & NSShiftKeyMask) {
// Shift key is DOWN
}
else{
// Shift key is UP
}
}
/ -keyDown:
(取自this answer)。