为什么我可以在NSWindowController中实现NSDraggingDestination方法?

时间:2013-01-13 18:37:58

标签: objective-c cocoa drag-and-drop

我正在使用Cocoa的Drag& amp;在非C环境中删除API。我必须使用objc / runtime.h函数,所以我需要了解我必须在哪里注入必要的方法。

现在,SDK文档说首先在NSView或NSWindow对象上调用registerForDraggedTypes。它进一步解释了这两个类都实现了NSDraggingDestination协议的存根,然后需要覆盖那些存根方法(至少是draggingEntered:和performDragOperation:需要;其余的是可选的)。

到目前为止一切顺利。

然而,我发现我也可以在窗口的控制器中实现这些方法,即在类型为NSWindowController的类中。举个例子,我是用Apple" DemoMonkey"示例,我在其DisplayController(这是一个NSWindowController)中实现了所需的调用,然后在' self.window'上调用了registerForDraggedTypes。

这怎么办?

我的意思是,在这种情况下,收到registerForDraggedTypes调用的对象如何与控制器相关,知道它必须要求它进行这些拖动回调?它记录在哪里以这种方式工作?

我想知道这是否与NSWindowController是NSResponder的事实有关。事实上,NSDraggingDestination调用是否通过响应者链运行? (对于记录:我还尝试创建NSResponder的子类,在那里实现回调而不是在控制器类中,创建它的实例并调用" self.window makeFirstResponder:"用它,但是在窗口上拖动数据时,没有导致调用回调。)

任何人都可以澄清这种行为,也许可以解释一下这个事实的记录(或者这只是简单的行为,因此不应该依赖它?)

1 个答案:

答案 0 :(得分:1)

这是因为您向窗口发送了registerForDraggedTypes:而NSWindowController是NSWindow的代表。

" Drag and Drop Programming Topics":

中提到了这一点
  

虽然NSDraggingDestination被声明为非正式协议,   您创建的NSWindow和NSView子类以采用该协议   只需实施那些相关的方法。 (NSWindow   和NSView类为所有的提供私有实现   方法。)窗口对象或其委托可以实现这些   方法;但是,如果代理的实现优先   这两个地方都有实施。

NSWindow registerForDraggedTypes:的文档:

  

为拖动类型注册NSWindow对象会自动生成   它是拖动会话的候选目标对象。 NSWindow有   许多方法的默认实现   NSDraggingDestination协议。默认实现转发   如果委托响应选择器,则向委托发送每条消息   的消息。以这种方式转发的消息是draggingEntered:,   draggingUpdated :, draggingExited:,prepareForDragOperation:,   performDragOperation:和concludeDragOperation:。

如果你想要实现类似" drop view"那么这不会发生。并在NSView上调用registerForDraggedTypes:。然后,您需要自己将所有消息转发给控制器。在任何一种情况下,我认为控制器无论如何都是拖放处理代码的更合适的地方。