我正在尝试将windows应用程序转换为OSX,现在一切都正常了,除了这个小功能,即将文件从我的应用程序拖放到任何其他支持拖放的窗口。接收drops很简单,问题是要拖动的数据源。
我的应用程序只有一个窗口和一个视图,我自己在其中绘制每个控件。所以我简单地扩展了我的视图,像这样的@interface NativeView : NSView <NSDraggingSource, NSPasteboardItemDataProvider>。
现在,在我看来,到目前为止我所拥有的代码的resto应该可以工作了,但话又说回来,我对cocoa和OSX了解不多:
NSArray *fileList = [NSArray arrayWithObjects:&pathList[0] count:pathList.size()];
NSPasteboard *pboard = [NSPasteboard pasteboardWithName: NSDragPboard];
[pboard declareTypes:[NSArray arrayWithObject:NSFilenamesPboardType] owner:nil];
[pboard setPropertyList:fileList forType:NSFilenamesPboardType];
NSPasteboardItem *pbItem = [NSPasteboardItem new];
[pbItem setDataProvider:view forTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, nil]];
[pbItem pasteboard:pboard provideDataForType:NSFilenamesPboardType];
NSDraggingItem *dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter:pbItem];
[dragItem setDraggingFrame:NSMakeRect(0, 0, 10, 10)];
[view beginDraggingSessionWithItems:[NSArray arrayWithObjects:dragItem, nil] event:mouseEvent source:view];fileList是一个NSString*数组。你看到的view是指接口NativeView,它是以这种方式实现的,因为这是在C++中编码的;
目前,当我尝试在pbItem中设置pasteboard时,代码会阻塞。我的意思是,任何其他的东西都不会超过这条线。我还试图去掉所有的NSPasteboard,只使用NSPasteboardItem,但是我得到了一个运行最后一行的EXC_BAD_ACCESS:beginDraggingSessionWithItems。
我在网上没有找到任何关于拖拽文件的例子,所有的都是NSImage,我不需要这种类型的拖拽。
欢迎任何帮助,谢谢。
发布于 2017-02-06 22:26:36
是的,在线文档非常缺乏。
尝试使用以下方法:
auto* dragItems = [[NSMutableArray alloc] init];
for (auto& path : pathList)
{
auto* fileURL = [NSURL fileURLWithPath: path];
auto* dragItem = [[NSDraggingItem alloc] initWithPasteboardWriter: fileURL];
[dragItem setDraggingFrame: NSMakeRect(0, 0, 10, 10)];
[dragItems addObject: dragItem];
}
[view beginDraggingSessionWithItems: dragItems
event: mouseEvent
source: view]https://stackoverflow.com/questions/40055527
复制相似问题