【问题标题】:How can you identify the source window for a drag operation in a Cocoa app如何识别 Cocoa 应用程序中拖动操作的源窗口
【发布时间】:2014-01-20 19:27:00
【问题描述】:

我有一个基于文档的应用程序,其中窗口具有拆分视图。左侧窗格是 NSOutlineView,右侧是显示元素的画布。

我目前支持画布和大纲视图的拖放(两者应该具有相同的粘贴板类型,并且应该能够拖放到右侧或左侧窗格中)。

我想弄清楚如何识别拖动的源窗口。这样我可以禁用在同一窗口内的画布或 NSOutlineView 上的拖放。我看到 NSDraggingInfo 有一个 draggingSource 属性,但我无法使用它,因为它不是原始窗口。它还有一个 draggingDestinationWindow 属性,但没有一个用于源。

知道如何解决这个问题吗?


更新

随着 Will 推动使用 draggingSource,我重新审视了我的代码并意识到我忽略了 draggingSource 的使用,因为有时我还处理来自 Finder 的拖动,当我尝试访问 NSView 的 window 属性时会崩溃。

我已经更新了以下方法的协议实现

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender


id<NSDraggingSource> dragSource = [sender draggingSource];
if ( [dragSource respondsToSelector:@selector(window)] && [(NSView *)dragSource window] == [self window])
    return NO;

【问题讨论】:

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


    【解决方案1】:

    如果这一切都在一个应用程序中,您应该可以使用draggingSource

    This method returns nil if the source is not in the same application as the destination. The dragging source implements methods from the NSDraggingSource protocol.
    

    【讨论】:

    • 谢谢 Will,我用根据您的建议构建的实际解决方案更新了我的问题。不过,这对我来说似乎有点“hacky”——这看起来是一个好的解决方案吗?
    • 我不知道你的拖拽是怎么做的,你可以检查一下(dragSource == self)吗?
    • 问题是在左窗格中,dragSource 是一个 NSOutlineView,而在右边它是一个 NSView。但是,如果两个窗格来自同一个窗口,则它们不应接受彼此的拖动 - 仅当它来自另一个文档时。 (想想两个 Photoshop 文档 - 您可以从图层列表或画布拖动到另一个文档。但您不能从一个文档的图层列表拖动到它自己的画布上)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多