【问题标题】:Why can I implement NSDraggingDestination methods in a NSWindowController?为什么我可以在 NSWindowController 中实现 NSDraggingDestination 方法?
【发布时间】:2013-01-13 18:37:58
【问题描述】:

我正在研究在非 C 环境中使用 Cocoa 的拖放 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:”,但这并没有导致在窗口上拖动数据时调用的回调。)

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

【问题讨论】:

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


    【解决方案1】:

    发生这种情况是因为您向窗口发送了registerForDraggedTypes:,而 NSWindowController 是 NSWindow 的委托。

    这在“Drag and Drop Programming Topics”中有所提及:

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

    还有 NSWindow 的 registerForDraggedTypes: 的文档:

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

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

    【讨论】:

    • 我现在无法验证这一点,但听起来你一针见血。谢谢!
    • “NSWindowController 是 NSWindow 的代表”默认情况下并不总是如此,例如对于带有故事板的新模板项目
    • @AlexanderB 我从来没有说过它总是是真的。我说在 this 情况下可能是真的,因此它是问题中描述的行为的原因......
    猜你喜欢
    • 2013-01-20
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多