我在NSView中有一个NSTextView,不可编辑,不可选择。我需要NSView在单击文本视图时接收单击事件 - 基本上我需要单击事件来表现为文本视图甚至不存在。
显然我会使用textView:clickedOnCell:inRect:atIndex:
文本视图委托方法,但我需要捕获click事件,以检测双击等事情。
答案 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;
}