我正在使用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:"用它,但是在窗口上拖动数据时,没有导致调用回调。)
任何人都可以澄清这种行为,也许可以解释一下这个事实的记录(或者这只是简单的行为,因此不应该依赖它?)
答案 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:
。然后,您需要自己将所有消息转发给控制器。在任何一种情况下,我认为控制器无论如何都是拖放处理代码的更合适的地方。