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)
你问题的第二部分的答案是这样的:
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
return NSDragOperationCopy;
}
Run Code Online (Sandbox Code Playgroud)
如果您返回NSDragOperationCopy
,您将获得复制操作的鼠标徽章。(当然,您可以而且应该不只是NSDragOperationCopy
无条件返回;检查粘贴板上的对象,看看您是否可以接受它们。)
我不确定您问题第一部分的答案是什么,因为我无法重新创建子视图阻塞效果。
好吧,不幸的是,答案是你不能。您拖动的图像包含在 , 中NSImageView
,并且NSImageView
s 本身接受拖动事件,因此它会抓取拖动事件而不对其进行任何操作。如果您的子视图是自定义类,您可以 a) 不实现拖放,在这种情况下,将通过拖动;b) 实现拖放以接受子视图的拖动。在这种情况下,您使用的是一个您无法控制的类。如果你想让它做的只是显示一个图像,你应该能够创建另一个NSView
子类,除了在其中绘制图像之外什么都不做drawRect:
归档时间: |
|
查看次数: |
2646 次 |
最近记录: |