NSView通过NSTextView接收点击事件

时间:2011-08-20 16:55:26

标签: cocoa nsview nstextview mouseclick-event

我在NSView中有一个NSTextView,不可编辑,不可选择。我需要NSView在单击文本视图时接收单击事件 - 基本上我需要单击事件来表现为文本视图甚至不存在。

显然我会使用

textView:clickedOnCell:inRect:atIndex:

文本视图委托方法,但我需要捕获click事件,以检测双击等事情。

2 个答案:

答案 0 :(得分:8)

在包含文字视图的视图中,覆盖the hitTest: method以返回self。然后,鼠标事件将被发送到容器视图。

买者

我已经发现hitTest:将在窗口中的任意位置中调用点击和鼠标跟踪事件,即使对于那些自然不会在容器视图附近的事件也是如此。如果窗口中有其他视图,则您的hitTest:方法会将容器视图转换为黑洞,导致所有这些事件都被吸引到自身中,永远不会被任何其他视图看到。

修复此问题是在吞咽之前测试事件是否在您的视图中。如果是,请返回self;如果不是,请返回nil

最简单的方法是调用super的实现,如果该点在视图中,它将返回视图或其自身的任何子视图,然后只返回self方法返回非 - nil。如果它返回nil,那么您也会返回nil

一个不太简单但可能更有效的方法是从窗口的坐标系到视图的convert the point,然后使用NSPointInRect来测试该点是否在视图的bounds

答案 1 :(得分:2)

将Peter的精彩描述放入代码中:

- (NSView *)hitTest:(NSPoint)aPoint
{
    NSView *result = [super hitTest:aPoint];
    if (result)
    {
        result = self;
    }
    return result;
}