Cocoa NSView子视图阻止拖放

use*_*064 10 macos cocoa drag-and-drop objective-c nsview

我有一个NSView子类,它在init方法中注册拖动文件,如下所示:

    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
Run Code Online (Sandbox Code Playgroud)

拖放工作完全正常,但如果我使用完全相同的框架向该视图添加子视图,它将不再起作用.我的猜测是子视图阻止拖动事件进入超级视图.我可以避免吗?谢谢

另外,我知道我问了两个问题,但我不想为此创建一个新主题:当我拖动时,我的光标不会像其他拖动一样变为"+"符号,我该怎么办?去做?再次感谢.

更新:以下是我在IB中设置的方式: 在此输入图像描述

DrawView是我所说的为draggedtypes注册的自定义类.图像视图只是一个子视图,我从媒体部分拖动了一个图像...如果它有帮助,这是我的DragView的相关代码:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    return NSDragOperationCopy;
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    pboard = [sender draggingPasteboard];
    NSArray *list = [pboard propertyListForType:NSFilenamesPboardType];
    if ([list count] == 1) {
        BOOL isDirectory = NO;
        NSString *fileName = [list objectAtIndex:0];
        [[NSFileManager defaultManager] fileExistsAtPath:fileName
                                             isDirectory: &isDirectory];
        if (isDirectory) {
            NSLog(@"AHH YEA");
        } else {
            NSLog(@"NOO");
        }
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ell 5

你问题的第二部分的答案是这样的:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
    return NSDragOperationCopy;
}
Run Code Online (Sandbox Code Playgroud)

如果您返回NSDragOperationCopy,您将获得复制操作的鼠标徽章。(当然,您可以而且应该不只是NSDragOperationCopy无条件返回;检查粘贴板上的对象,看看您是否可以接受它们。)

我不确定您问题第一部分的答案是什么,因为我无法重新创建子视图阻塞效果。

好吧,不幸的是,答案是你不能。您拖动的图像包含在 , 中NSImageView,并且NSImageViews 本身接受拖动事件,因此它会抓取拖动事件而不对其进行任何操作。如果您的子视图是自定义类,您可以 a) 不实现拖放,在这种情况下,通过拖动;b) 实现拖放以接受子视图的拖动。在这种情况下,您使用的是一个您无法控制的类。如果你想让它做的只是显示一个图像,你应该能够创建另一个NSView子类,除了在其中绘制图像之外什么都不做drawRect:

  • 如上所述(并链接到原始[源](http://stackoverflow.com/questions/4782636/nsview-subviews-interrupting-drag-operation))答案是使用`[imageView unregisterDraggedTypes取消注册NSImageView的拖动类型];` (19认同)