0

起初,我有一个带有自定义控件的窗口。为了让它接受鼠标移动的事件,我只需将其放入 awakeFromNib:

代码:

[[自我窗口] makeFirstResponder:self]; [[自窗口] setAcceptsMouseMovedEvents:YES];

现在我在同一个窗口中对其中的四个做一些事情,这不再那么漂亮了。首先,我将它们从控件的 awakeFromNib 中取出并决定使用我的 appController 来管理它,即 [window makeFirstResponder:View]

我的问题是,如果我希望每个都响应鼠标移动事件,我如何在同一视图中管理其中的四个?现在,我已经告诉窗口响应 mouseMoved 事件,但没有一个视图响应 mouseMoved。

4

1 回答 1

1

您还需要覆盖 -acceptsFirstResponder 以返回 YES。

    #pragma mark NSResponder 覆盖
    - (BOOL)acceptsFirstResponder
    {
    返回是;
    }

-mouseMoved 事件很昂贵,所以当我的控件的 -mouseExited 消息被调用时我关闭鼠标移动事件并在 -mouseEntered 中打开它。

    - (void)mouseEntered:(NSEvent *)theEvent
{
    [[自窗口] setAcceptsMouseMovedEvents:YES];
    [[自我窗口] makeFirstResponder:self];
}

- (void)mouseMoved:(NSEvent *)theEvent
{
...
}

- (void)mouseExited:(NSEvent *)theEvent
{
    [[自我窗口] setAcceptsMouseMovedEvents:NO];
}

我在我的自定义控件应用程序中快速测试了这一点。我在 nib 文件中多次复制了控件,它按预期工作。

您可能还需要:

- (void)awakeFromNib
{
    [[自窗口] setAcceptsMouseMovedEvents:YES];
    [self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES];
}

我不认为 -setAcceptsMouseMovedEvents 是必要的,但我很确定跟踪 rect 代码是必要的。您可能还需要尝试使用assumeInside: 参数的值,但这已记录在案。

于 2009-02-02T22:32:23.267 回答