为什么 -[NSPasteboard readObjectsForClasses:options:] return 只能拖拽 1 个项目?
Why does -[NSPasteboard readObjectsForClasses:options:] return only 1 item from a drag?
我正在使用 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(有很多 NSLog 可以看到项目实际上正在写入粘贴板)。
原来 -pasteboard:item:provideDataForType:
的实现需要在项目 上设置数据 ,而不是在粘贴板上——设置后者会覆盖之前为其他项目写入的数据。
我正在使用 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]]
,您将返回所有未修改的项目。)
知道为什么会这样吗? Sample project available here(有很多 NSLog 可以看到项目实际上正在写入粘贴板)。
原来 -pasteboard:item:provideDataForType:
的实现需要在项目 上设置数据 ,而不是在粘贴板上——设置后者会覆盖之前为其他项目写入的数据。