【问题标题】:Why does -[NSPasteboard readObjectsForClasses:options:] return only 1 item from a drag?为什么 -[NSPasteboard readObjectsForClasses:options:] 从拖动中只返回 1 个项目?
【发布时间】:2015-01-22 21:52:36
【问题描述】:

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

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]],则所有项目都会原封不动地返回。)

知道为什么会这样吗? Sample project available here(有很多 NSLogs 可以看到这些项目实际上正在写入粘贴板)。

【问题讨论】:

    标签: macos cocoa drag-and-drop nspasteboard


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2012-01-03
      • 2011-04-23
      • 2021-03-11
      • 1970-01-01
      相关资源
      最近更新 更多