首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的Cocoa应用程序的内部拖动不起作用?

为什么我的Cocoa应用程序的内部拖动不起作用?
EN

Stack Overflow用户
提问于 2020-01-08 19:49:56
回答 1查看 95关注 0票数 0

我的Cocoa应用程序的工作方式是每个窗口都有一个子类NSView,并在其中呈现许多内部视图。我最近转而使用NSView的beginDraggingSessionWithItems:event:source函数来支持将文件承诺拖到外部应用程序(如Finder)。但是内部拖动类型(基本类型String和二进制blob)需要从NSWindow的dragImage移植过来。我注意到的主要区别是,默认情况下,beginDraggingSessionWithItems不允许我从应用程序拖动到我的应用程序……就像它自身的内部一样。例如,如果我有一个树形控件,并且使用DnD来移动元素,那么它就不能工作。将文件拖放到应用程序中是可行的。将承诺从应用程序中拖出是可行的。只是内部什么都没有。

一些代码。下面是我创建二进制项的地方:

代码语言:javascript
复制
auto drag_items = [[NSMutableArray alloc] init];
auto item = [[NSPasteboardItem alloc] init];

NSData *data = [NSData dataWithBytes:myBinary.Data length:myBinary.Length];
[item setData:data forType:dd.Format.NsStr()];

auto drag_item = [[NSDraggingItem alloc] initWithPasteboardWriter:item];
drag_item.draggingFrame = NSMakeRect(floor(position.x), floor(position.y), 32, 32);
[drag_items addObject:drag_item];

然后开始拖动:

代码语言:javascript
复制
NSDraggingSession *session = [myNsWindow.contentView    beginDraggingSessionWithItems:drag_items
                                                        event:myEvent
                                                        source:DragSrc];

拖动源实现draggingSession的方式如下:

代码语言:javascript
复制
- (NSDragOperation)draggingSession:(nonnull NSDraggingSession *)session
        sourceOperationMaskForDraggingContext:(NSDraggingContext)context
{
    switch (context)
    {
        case NSDraggingContextOutsideApplication:
            return NSDragOperationCopy;

        case NSDraggingContextWithinApplication:
            return NSDragOperationCopy | NSDragOperationGeneric | NSDragOperationMove;

        default:
            return NSDragOperationNone;
    }
}

全拖动源代码在GDragAndDrop.mm中可用,全拖动目标代码在LCocoaView.mm中可用。

我看到的是,没有任何拖动目标方法被调用,当我释放鼠标时,图像会捕捉回拖动源。

我记得有一个标志或设置的东西,允许相同的视图既是源又是目标。但我这一生都找不到它。

编辑:以下是我传递给NSView的registerForDraggedTypes的类型:

代码语言:javascript
复制
"public.item"
"com.apple.NSFilePromiseItemMetaData"
"dyn.ah62d4rv4gu8yc6durvwwa3xmrvw1gkdusm1044pxqyuha2pxsvw0e55bsmwca7d3sbwu"
"com.apple.pasteboard.promised-file-content-type"

我认为发生的情况是注册的类型与我试图拖动的类型不匹配。我想要的是一个通配符,以便接收器获取所有类型,而我在较低的层进行过滤。这就是为什么列表中有'public.item‘,但它不是我想要的那样工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-09 08:40:43

所以问题是视图没有为我正在拖动的类型注册。我认为'public.item‘会是不同类型的集合,所以我拖拽什么都无关紧要。但这只在你拖动的类型符合'public.item‘的情况下才有效,在我的例子中,我没有为那个拖动类型导出UTI。所以在我的拖拽类型和‘public.item.item’之间没有联系。

下面是我如何定义UTI的:

一旦我这样做了,我就可以在我的应用程序中拖动节点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59645253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档