Почему -[NSPasteboard readObjectsForClasses:options:] возвращает только 1 элемент из перетаскивания?

Я пишу несколько объектов в 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, чтобы увидеть, что элементы фактически записываются на монтажный стол).


person jtbandes    schedule 22.01.2015    source источник


Ответы (1)


Оказывается, реализация -pasteboard:item:provideDataForType: должна устанавливать данные в элементе, а не на монтажном столе — в последнем случае ранее записанные данные для других элементов перезаписываются.

person jtbandes    schedule 22.01.2015