objective c - 将文件拖到可可OSX中的其他应用程序中



objective-c macos (1)

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

我的应用程序只有1个窗口和1个视图,我在那里绘制每个控件。 所以我简单地扩展了我的视图像@interface NativeView : NSView <NSDraggingSource, NSPasteboardItemDataProvider>

现在,我到目前为止的代码的其余部分应该工作在我看来,但是我再次对可可和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 ,我没有用于这种类型的拖动。

任何帮助将受到欢迎,谢谢。


是的,在线文档相当缺乏。

尝试使用以下方法:

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]




nspasteboard