Cocoa 将允许的操作限制为仅NSDragOperationCopy

Cocoa 将允许的操作限制为仅NSDragOperationCopy,cocoa,drag-and-drop,Cocoa,Drag And Drop,我有一个自定义视图,它是一个拖动源。我想将允许的拖动操作限制为仅一个副本,因此在draggingSession:SourceOperationMaskForDragingContext:方法中返回NSDragOperationCopy 出于某种原因,这没有效果 我的代码似乎没有任何问题,因为返回的NSDragOperationNone按预期工作并阻止了拖动 下面是我的NSView中的代码,它是拖动源代码。从视图拖动到“垃圾箱”,您将看到NSDragOperationMove或NSDragOper

我有一个自定义视图,它是一个拖动源。我想将允许的拖动操作限制为仅一个副本,因此在draggingSession:SourceOperationMaskForDragingContext:方法中返回NSDragOperationCopy

出于某种原因,这没有效果

我的代码似乎没有任何问题,因为返回的NSDragOperationNone按预期工作并阻止了拖动

下面是我的NSView中的代码,它是拖动源代码。从视图拖动到“垃圾箱”,您将看到NSDragOperationMove或NSDragOperationDelete,即使我只想允许NSDragOperationCopy操作

我还上传了一个小的演示项目来演示我所说的:

有人吗


谢谢

你能解释一下最后一部分吗?“返回NSDragOperationNone按预期工作并阻止拖动”?并发布一些代码吗?嘿,诺亚。用一个小的演示项目更新了这个问题。你能在这里发布你认为可能与你的问题相关的代码吗?谢谢,这很有帮助。如果不是垃圾桶等,你想要和期望的阻力目标是什么?这不是相关的目标。这是我关注的允许拖动操作。从苹果的文档中可以看出:“只需要实现一个NSDraggingSource方法:draggingSourceOperationMaskForLocal:。此方法声明源允许执行哪些类型的操作。”如果我将其设置为仅允许复制,我希望垃圾箱上的一滴操作不会起任何作用。
- (void)mouseDown:(NSEvent *)event {
    NSString *path = [[NSBundle mainBundle] resourcePath];
    NSString *imagePath = [path stringByAppendingString:@"/image.png"];

    NSImage *image = [[NSImage alloc] initWithContentsOfFile:imagePath];

    NSArray *file = [NSArray arrayWithObject:imagePath];
    NSPasteboard *pboard = [NSPasteboard pasteboardWithName:NSDragPboard];
    [pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil];
    [pboard setPropertyList:file forType:NSFilenamesPboardType];

    [self dragImage:image at:NSZeroPoint offset:NSMakeSize(0, 0) event:event pasteboard:pboard source:self slideBack:NO];
}

- (NSDragOperation)draggingSession:(NSDraggingSession *)session sourceOperationMaskForDraggingContext:(NSDraggingContext)context {
    return NSDragOperationCopy;
}

- (void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation {
    NSLog(@"Dragging session ended with operation: %li", operation);
}