将文件拖到cocoa OSX中的其他应用程序中

时间:2016-10-15 05:55:25

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

我试图将Windows应用程序转换为OSX,现在一切正常,除了这个小功能,从我的应用程序拖放文件到支持丢弃的任何其他窗口。接收丢弃它很容易,问题是拖动数据的来源。

我的应用程序只有一个带有1个视图的窗口,我在那里绘制每个控件。所以我只是扩展了我的观点@interface NativeView : NSView <NSDraggingSource, NSPasteboardItemDataProvider>

现在我的代码的其余部分应该在我看来是有效的,但是我再也不了解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 ++中编码的;

目前,当我尝试在pasteboard中设置pbItem时代码会阻止。我的意思是没有别的东西在那条线上执行。我还试图一起摆脱NSPasteboard并仅使用NSPasteboardItem,但我得到一个EXC_BAD_ACCESS运行最后一行:beginDraggingSessionWithItems

我没有在网上找到任何关于拖动文件的例子,所有这些都是NSImage,而且我没有使用这种类型的拖动。

欢迎任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

是的,在线文档非常缺乏。

尝试使用以下方法:

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]