我有一个NSView子类,它在init方法中注册拖动文件,如下所示:
[self registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]];
拖放效果非常好,但是如果我使用完全相同的帧向此视图添加子视图,则它不再起作用。我的猜测是子视图阻止拖动事件进入超级视图。我可以避免吗?感谢
另外,我知道我问两个问题,但我不想为此创建一个新主题:当我拖动时,我的光标不会像其他拖动一样变为“+”符号,我怎样才能做到这一点? 再次感谢。
更新: 以下是我在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;
}
答案 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()
(以防其他人首先偶然发现此问题,而不是在评论中发现链接的问题)