Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 默认的第一响应者是什么?_Macos_Cocoa - Fatal编程技术网

Macos 默认的第一响应者是什么?

Macos 默认的第一响应者是什么?,macos,cocoa,Macos,Cocoa,我对cocoa非常陌生,对第一反应者的整个概念感到困惑。对象何时成为第一响应者? 假设我的视图层次结构中的每个对象都接受第一响应者状态,如果没有明确的“becomeFirstResponder”,那么启动应用程序后默认的第一响应者是什么 已更新: 关于我的困惑,我可能应该更具体一点,这源于我为研究第一反应者的行为所做的以下实验 实验1): 这个实验的目的是检测第一反应者的“mouseMoved”。根据规范,“mouseMoved”总是先发送给第一响应者 我在Xcode中构建了以下层次结构: NS

我对cocoa非常陌生,对第一反应者的整个概念感到困惑。对象何时成为第一响应者? 假设我的视图层次结构中的每个对象都接受第一响应者状态,如果没有明确的“becomeFirstResponder”,那么启动应用程序后默认的第一响应者是什么

已更新

关于我的困惑,我可能应该更具体一点,这源于我为研究第一反应者的行为所做的以下实验

实验1):

这个实验的目的是检测第一反应者的“mouseMoved”。根据规范,“mouseMoved”总是先发送给第一响应者

我在Xcode中构建了以下层次结构:

NSWindow -NSView -myCustomView

myCustomView继承自NSView,实现如下:

@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中分配。至于运行之间的不同行为,您的窗口可能会自动恢复其状态:这正是我想要的!它现在正按照我预期的方式工作。非常感谢你!