0

我正在向 NSPasteboard 写入一些对象以进行拖动操作beginDraggingSessionWithItems:event:source:

NSMutableArray *draggingItems = [NSMutableArray array];
for (NSUInteger i = 0; i < numItems; i++) {
    NSPasteboardItem *pasteboardItem = [NSPasteboardItem new];

    [pasteboardItem setDataProvider:[MyItem itemForIndex:i]
                           forTypes:@[@"com.test.FooType"]];

    NSDraggingItem *draggingItem = [[NSDraggingItem alloc] initWithPasteboardWriter:pasteboardItem];
    // ...
    [draggingItems addObject:draggingItem];
}

[sourceView beginDraggingSessionWithItems:draggingItems
                                    event:theEvent
                                   source:self];

在拖动目的地(在同一个应用程序中),我尝试使用 接收这些项目readObjectsForClasses:options:,但我只收到其中一个。

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender
{
    // sender.draggingPasteboard.pasteboardItems contains all items

    NSArray *myItems = [sender.draggingPasteboard readObjectsForClasses:@[[MyItem class]] options:nil];
    // pasteboard:item:provideDataForType: is called for each object on the pasteboard...
    // ...but this method only returns 1 object (the first one)??

(请注意,如果您通过@[[NSPasteboardItem class]]了课程,您将获得所有未修改的项目。)

知道为什么会发生这种情况吗?此处提供示例项目(包含大量 NSLogs 以查看项目实际上正在写入粘贴板)。

4

1 回答 1

0

原来-pasteboard:item:provideDataForType:需要在 item 上设置数据的实现,而不是在粘贴板上 - 这样做会覆盖以前为其他项目写入的数据。

于 2015-01-22T22:37:19.667 回答