我在 NSView 中有一个不可编辑、不可选择的 NSTextView。我需要 NSView 在单击 TextView 时接收单击事件 - 基本上我需要单击事件就像 TextView 根本不存在一样。显然我只会使用
textView:clickedOnCell:inRect:atIndex:
TextView 委托(delegate)方法,但我需要捕获点击事件,以检测双击和类似的事情。
最佳答案
在包含 TextView 的 View 中,覆盖 the hitTest:
method返回self
。然后鼠标事件将被发送到容器 View 。
警告
我发现 hitTest:
将在窗口中任何地方的点击和鼠标跟踪事件中被调用,即使对于本来不会在任何地方的事件靠近容器 View 。如果窗口中还有其他 View ,您的 hitTest:
方法会将容器 View 变成一个黑洞,导致所有这些事件都被吸引到自身中,永远不会被任何其他 View 看到。
解决这个问题的方法是在吞下事件之前测试该事件是否在您的视野范围内。如果是,则返回self
;如果不是,则返回nil
。
最简单的方法是调用 super
的实现,如果该点位于 View 内,它将返回 View 或其自身的任何 subview ,然后仅返回 self
如果该方法返回非nil
。如果它返回 nil
,那么您也返回 nil
。
一个不太简单但可能更有效的方法是 convert the point从窗口的坐标系到 View 的坐标系,然后使用 NSPointInRect 来测试该点是否在 View 的边界内。
关于cocoa - NSView 通过 NSTextView 接收点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7133245/