Cocoa NSView子视图阻止拖放

时间:2011-05-05 03:47:38

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

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

    [self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];

拖放效果非常好,但是如果我使用完全相同的帧向此视图添加子视图,则它不再起作用。我的猜测是子视图阻止拖动事件进入超级视图。我可以避免吗?感谢

另外,我知道我问两个问题,但我不想为此创建一个新主题:当我拖动时,我的光标不会像其他拖动一样变为“+”符号,我怎样才能做到这一点? 再次感谢。

更新: 以下是我在IB中设置的方式: enter image description here

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;
}

2 个答案:

答案 0 :(得分:4)

问题第二部分的答案是:

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

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

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

好的,答案很遗憾,你做不到。您拖动的图片包含在NSImageView中,NSImageView接受拖动事件本身,因此它抓取拖动事件而不对其执行任何操作。如果你的子视图是一个自定义类,你可以a)不实现拖放,在这种情况下拖动传递; b)实现拖放以接受子视图的拖动。在这种情况下,您使用的是您无法控制的类。如果你想要它只是显示一个图像,你应该能够创建另一个NSView子类,除了在drawRect:

中绘制图像之外什么都不做

答案 1 :(得分:0)

如评论中所述,默认情况下,NSImageViews具有自己的拖放功能(用于接受被拖放到NSImageView上的图像)。如果您不想使用此行为,而是想使用超级视图的拖放行为,则需要在NSImageView中取消注册拖动行为。

Objc:

[imageView unregisterDraggedTypes];

迅速:

imageView.unregisterDraggedTypes()

(以防其他人首先偶然发现此问题,而不是在评论中发现链接的问题)