Macos 单击将事件路由到错误视图

Macos 单击将事件路由到错误视图,macos,cocoa,nsview,Macos,Cocoa,Nsview,我有一个窗口,其中有两个视图: 电影视图和控制器视图都会覆盖mouseDown:和mouseUp:,用于不同的目的(电影视图有一个目标和动作,并作为按钮进行反应,而控制器则寻找并支持拖动) 扭曲之处在于,当我在电影视图中单击时,如屏幕截图所示,该视图通常会大到足以使错过它而点击控制器视图的可能性非常小,mouseDown:和mouseUp:消息被发送到控制器视图!电影视图从未收到这两条消息 我没有在电影视图或其父视图(这是一个普通的NSView)中重写hitTest:,仅在控制器视图中重写(由

我有一个窗口,其中有两个视图:

电影视图和控制器视图都会覆盖
mouseDown:
mouseUp:
,用于不同的目的(电影视图有一个目标和动作,并作为按钮进行反应,而控制器则寻找并支持拖动)

扭曲之处在于,当我在电影视图中单击时,如屏幕截图所示,该视图通常会大到足以使错过它而点击控制器视图的可能性非常小,
mouseDown:
mouseUp:
消息被发送到控制器视图!电影视图从未收到这两条消息

我没有在电影视图或其父视图(这是一个普通的NSView)中重写hitTest:,仅在控制器视图中重写(由于与我在该视图上的跟踪区域有关的原因,我的实现只返回
self
,即控制器视图)


那么,给出了什么呢?

您可能已经猜到了:这是我在控制器视图中的
hitTest:
实现

事实证明,
hitTest:
不仅发送到鼠标位置所在帧的视图;它将发送到窗口中的每个视图,甚至是在单击的任意一端都不靠近鼠标的视图

因此,在重写hitTest:时,请确保您确认该点实际上位于您自己的内部。最简单的方法是发送
[super hitTest:thePoint]
,并且仅当结果不是
nil
时才执行自定义命中测试。(除非您想从窗口中的其他视图中窃取单击。)