4

我有一个NSTableView我希望能够拖放行来移动它们,并在按住 Option 的同时拖放(根据Apple 的文档)来复制它们。

我的视图控制器中有以下代码,这也是dataSource表格视图的代码。

- (void)awakeFromNib {
    [self.tableView registerForDraggedTypes:@[kRowIndexesPasteboardType]];
}

- (BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pasteboard {
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rowIndexes];
    [pasteboard declareTypes:@[kRowIndexesPasteboardType] owner:self];
    [pasteboard setData:data forType:kRowIndexesPasteboardType];
    return YES;
}

- (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation {
    // Only allow dropping above/below.
    return dropOperation == NSTableViewDropAbove ? (NSDragOperationMove|NSDragOperationCopy) : NSDragOperationNone;
}

- (BOOL)tableView:(NSTableView *)tableView acceptDrop:(id <NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation {
    if (dropOperation == NSTableViewDropAbove) {
        NSPasteboard* pasteboard = [info draggingPasteboard];
        NSData* rowData = [pasteboard dataForType:kRowIndexesPasteboardType];
        NSIndexSet* rowIndexes = [NSKeyedUnarchiver unarchiveObjectWithData:rowData];

        BOOL copy = ???;
        if (copy) {
            // Copy items at rowIndexes to row.
        } else {
            // Move items at rowIndexes to row.
        }
        return YES;
    }
    return NO;
}
  1. 如何使默认的拖动操作移动,并且仅在按住 Option 键时进行复制?目前,它默认为立即复制。
  2. tableView:acceptDrop:row:dropOperation:我如何判断该操作是复制操作还是删除操作?
4

2 回答 2

3

本讨论中所述,当没有修改键时, 的值draggingSourceOperationMask将是NSDragOperationEvery(除非更改):

当它作为删除验证返回您的表时,用户没有进行任何修改(没有选项键按下),那么任何原始选项都需要被认为是可能的。然后,您的验证应根据对放置目标的意义来选择您将执行的操作(从源允许的选项中)。

这意味着NSDragOperationCopy当按住 Option 键时将返回以下方法,NSDragOperationMove否则:

- (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation {
    // Allow moving or copying the rows.
    NSDragOperation moveOrCopy = (info.draggingSourceOperationMask == NSDragOperationCopy ? NSDragOperationCopy : NSDragOperationMove);
    // Only allow dropping above/below.
    return dropOperation == NSTableViewDropAbove ? moveOrCopy : NSDragOperationNone;
}

同样,可以以tableView:acceptDrop:row:dropOperation:类似的方式检查操作。

于 2015-09-06T04:51:56.653 回答
0

在 validateDrop 中:返回 [info draggingSourceOperationMask] & (NSDragOperationMove | NSDragOperationCopy) 或 NSDragOperationNone。

在 acceptDrop 中:检查 [info draggingSourceOperationMask] 和 NSDragOperationMove。

于 2015-09-05T11:40:13.610 回答