Macos 默认的第一响应者是什么?
我对cocoa非常陌生,对第一反应者的整个概念感到困惑。对象何时成为第一响应者? 假设我的视图层次结构中的每个对象都接受第一响应者状态,如果没有明确的“becomeFirstResponder”,那么启动应用程序后默认的第一响应者是什么 已更新: 关于我的困惑,我可能应该更具体一点,这源于我为研究第一反应者的行为所做的以下实验 实验1): 这个实验的目的是检测第一反应者的“mouseMoved”。根据规范,“mouseMoved”总是先发送给第一响应者 我在Xcode中构建了以下层次结构: NSWindow -NSView -myCustomView myCustomView继承自NSView,实现如下:Macos 默认的第一响应者是什么?,macos,cocoa,Macos,Cocoa,我对cocoa非常陌生,对第一反应者的整个概念感到困惑。对象何时成为第一响应者? 假设我的视图层次结构中的每个对象都接受第一响应者状态,如果没有明确的“becomeFirstResponder”,那么启动应用程序后默认的第一响应者是什么 已更新: 关于我的困惑,我可能应该更具体一点,这源于我为研究第一反应者的行为所做的以下实验 实验1): 这个实验的目的是检测第一反应者的“mouseMoved”。根据规范,“mouseMoved”总是先发送给第一响应者 我在Xcode中构建了以下层次结构: NS
@implementation myView
- (void)awakeFromNib
{
[[self window] setAcceptsMouseMovedEvents:YES];
}
- (void)drawRect:(NSRect)dirtyRect
{
[[NSColor blueColor] set];
NSRectFill([self bounds]);
}
- (void)mouseMoved:(NSEvent *)theEvent
{
NSLog(@"[MYCUSTOMVIEW] mouse moved");
}
@end
当我运行上述代码时,当我在屏幕上移动鼠标时,不会打印任何内容。这是意料之中的,因为NSWindow是第一个响应者。myCustomView从未收到“mouseMoved”
实验2):
我在myCustomView的实现中添加了以下内容:
- (BOOL)acceptsFirstResponder
{
return YES;
}
当我运行代码时,仍然没有输出任何内容。现在我很困惑,myCustomView不应该成为这个案例的第一响应者并接收“mouseMoved”事件吗
有趣的是,当我在myCustomView的边界内单击鼠标时,“[myCustomView]鼠标移动”消息开始显示在控制台中。我可以理解点击操作使myCustomView成为第一响应者,但为什么一开始就不是呢
如果我再次运行代码,这次会从一开始就显示“[MYCUSTOMVIEW]鼠标移动”消息。我不必再点击我的自定义视图了。发生了什么事
实验3):
我将“acceptsFirstResponder”更改为返回“否”,然后运行代码。“[MYCUSTOMVIEW]鼠标移动”消息从一开始就显示出来。真见鬼!myCustomView不再对成为第一响应者感兴趣。为什么它仍然接收“mouseMoved”事件
这让我很困惑。如果有人能告诉我上面发生了什么,以及启动时第一响应者是如何设置的,我将不胜感激
谢谢 鼠标事件的事件链与其他事件不同-它们总是发送到光标下最顶端的NSView,而不是第一响应者。这很好-如果您实际单击了窗口中其他位置的按钮,则您不希望将
mouseDown:
事件发送到正在编辑的文本字段(即第一响应者
)
如果您希望始终移动鼠标事件,请在视图中添加一个NSTrackingArea
,如下所示:
entireViewTrackingArea = NSTrackingArea(rect: .zero, options: [.mouseMoved, .activeInActiveApp, .inVisibleRect], owner: self, userInfo: nil)
addTrackingArea(entireViewTrackingArea!)
我不推荐
setAcceptsMouseMovedEvents:
,因为它对于您想要的东西来说有点极端。(您通常不希望窗口中的每个视图都有鼠标移动事件,这可能会很昂贵。)请看一看感谢您的重播。文档似乎没有解释启动应用程序时如何设置第一响应者。我已经更新了我的问题。您正在查找NSWindow的initialFirstResponder
属性,该属性可以从Interface Builder中分配。至于运行之间的不同行为,您的窗口可能会自动恢复其状态:这正是我想要的!它现在正按照我预期的方式工作。非常感谢你!