mouseDragged 事件被另一个视图窃取

jls*_*ker 5 cocoa objective-c nsview nsresponder

我对另一个类MyView(的子类)有几种看法。实现、、、和。NSViewNSViewMyView-mouseEntered:-mouseExited:-mouseDown:-mouseDragged:-mouseUp:

几乎总是,当 aMyView接收到鼠标按下事件时,所有后续的鼠标拖动事件都会由该事件接收,MyView直到下一个鼠标释放事件。即使光标超出了MyView. 这是预期的行为。

有时, aMyView会收到鼠标按下事件,但只会在光标保留在MyView. 如果光标移动到不同的MyView,则MyView开始接收鼠标拖动事件(无需首先接收鼠标按下事件),并且可以接收后续的鼠标按下事件。

如果重要的话,鼠标按下事件会在 之上创建一个FooView( 的子类) ,并且鼠标拖动事件会调整 的框架大小。这可能是相关的,因为我只能在创建其中之一后才能重现该问题。不实现任何鼠标事件方法。NSViewMyViewFooViewFooViewFooView

我已经搞乱这个问题有一段时间了,但无法故意重现该问题或在一个简单的示例中重新创建该问题。我很乐意回答有关我的代码的任何问题,我只是不确定要发布的相关部分是什么。

smo*_*ris 3

不确定根本问题是什么(这种 Cocoa 行为对我来说似乎不一致)...但这里有一个可能的解决方法:

  1. 在超级视图中,创建一个实例变量来跟踪发生的MyView实例-mouseDown:
  2. 当您收到-mouseDragged:in时MyView,不是对 进行操作self,而是对MyView存储在超级视图中的实例引用进行操作。

...然后您将能够持续跟踪正在拖动的对象,而无需运行自己的事件循环。