gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:13:27 25 4
gpt4 key购买 nike

我正在致力于在非 C 环境中使用 Cocoa 的拖放 API。我必须使用 objc/runtime.h 函数,因此我需要了解必须在何处注入(inject)必要的方法。

现在,SDK 文档说,首先在 NSView 或 NSWindow 对象上调用 registerForDraggedTypes。它进一步解释了这两个类都实现了 NSDraggingDestination 协议(protocol)的 stub ,并且需要覆盖这些 stub 方法(至少需要重写 DraggingEntered: 和 PerformDragOperation: ;其余的都是可选的)。

到目前为止一切顺利。

但是,我发现我也可以在窗口的 Controller 中实现这些方法,即在 NSWindowController 类型的类中。作为示例,我使用 Apple 的“DemoMonkey”示例执行此操作,其中我在其 DisplayController(它是 NSWindowController)中实现了所需的调用,然后在“self.window”上调用 registerForDraggedTypes。

这怎么行?

我的意思是,在这种情况下,接收 registerForDraggedTypes 调用的对象如何与 Controller 相关,知道它必须向 Controller 请求这些拖动回调?哪里有记录表明这种方式有效?

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

任何人都可以澄清这种行为,并解释一下这个事实是在哪里记录的(或者这只是未记录的行为,因此不应依赖?)

最佳答案

发生这种情况是因为您将 registerForDraggedTypes: 发送到窗口,并且 NSWindowController 是 NSWindow 的委托(delegate)。

这在“Drag and Drop Programming Topics”中提到:

Although NSDraggingDestination is declared as an informal protocol, the NSWindow and NSView subclasses you create to adopt the protocol need only implement those methods that are pertinent. (The NSWindow and NSView classes provide private implementations for all of the methods.) Either a window object or its delegate may implement these methods; however, the delegate’s implementation takes precedence if there are implementations in both places.

以及 NSWindow 的文档 registerForDraggedTypes: :

Registering an NSWindow object for dragged types automatically makes it a candidate destination object for a dragging session. NSWindow has a default implementation for many of the methods in the NSDraggingDestination protocol. The default implementation forwards each message to the delegate if the delegate responds to the selector of the message. The messages forwarded this way are draggingEntered:, draggingUpdated:, draggingExited:, prepareForDragOperation:, performDragOperation:, and concludeDragOperation:.

如果您想实现“下拉​​ View ”之类的内容并在 NSView 上调用 registerForDraggedTypes: ,则不会发生这种情况。然后您需要自己将所有消息转发给 Controller 。无论哪种情况,我认为 Controller 都是更适合拖/放处理代码的地方。

关于objective-c - 为什么我可以在 NSWindowController 中实现 NSDraggingDestination 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14306821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com