我在 NSView 中有一个 NSTextView,不可编辑,不可选择。当单击文本视图时,我需要 NSView 接收单击事件 - 基本上我需要单击事件来充当文本视图甚至不存在的行为。显然我会使用
textView:clickedOnCell:inRect:atIndex:
文本视图委托方法,但我需要捕获点击事件,以检测双击和类似的事情。
我在 NSView 中有一个 NSTextView,不可编辑,不可选择。当单击文本视图时,我需要 NSView 接收单击事件 - 基本上我需要单击事件来充当文本视图甚至不存在的行为。显然我会使用
textView:clickedOnCell:inRect:atIndex:
文本视图委托方法,但我需要捕获点击事件,以检测双击和类似的事情。
在包含文本视图的视图中,重写hitTest:
返回方法self
。然后鼠标事件将被发送到容器视图。
从那以后,我发现hitTest:
将在窗口中的任何位置调用单击和鼠标跟踪事件,即使对于自然不会在容器视图附近的任何事件也是如此。如果窗口中还有其他视图,您的hitTest:
方法会将容器视图变成一个黑洞,导致所有这些事件都被吸引到自身中,而不会被任何其他视图看到。
解决方法是在吞下之前测试事件是否在您的视图中。如果是,则返回self
;如果不是,则返回nil
。
最简单的方法是调用super
的实现,如果该点在视图内,它将返回视图或自身的任何子视图,然后self
如果该方法返回 non- 则返回nil
。如果它返回nil
,那么你也返回nil
。
一种不太简单但可能更有效的方法是将点从窗口的坐标系转换为视图的坐标系,然后用于NSPointInRect
测试该点是否在视图的bounds
.
只是将彼得的精彩描述放入代码中:
- (NSView *)hitTest:(NSPoint)aPoint
{
NSView *result = [super hitTest:aPoint];
if (result)
{
result = self;
}
return result;
}