Cocoa 如何允许通过在NSTableView中拖动行来移动和复制?

Cocoa 如何允许通过在NSTableView中拖动行来移动和复制?,cocoa,drag-and-drop,nstableview,nsdragginginfo,Cocoa,Drag And Drop,Nstableview,Nsdragginginfo,我有一个NSTableView,我希望能够通过拖放行来移动它们,并在按住选项(根据)的同时拖放来复制它们 我的视图控制器中有以下代码,这也是表视图的dataSource - (void)awakeFromNib { [self.tableView registerForDraggedTypes:@[kRowIndexesPasteboardType]]; } - (BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:

我有一个
NSTableView
,我希望能够通过拖放行来移动它们,并在按住选项(根据)的同时拖放来复制它们

我的视图控制器中有以下代码,这也是表视图的
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;
}
-(void)从NIB唤醒{
[self.tableView registerfordragedtypes:@[kRowIndexesPasteboardType];
}
-(BOOL)tableView:(NSTableView*)tableView writeRowsWithIndexes:(NSIndexSet*)行索引到粘贴板:(NSPasteboard*)粘贴板{
NSData*data=[NSKeyedArchivedDataWithRootObject:rowIndexes];
[pasteboard declareTypes:@[kRowIndexesPasteboardType]所有者:self];
[粘贴板设置数据:数据类型:kRowIndexesPasteboardType];
返回YES;
}
-(NSDragOperation)tableView:(NSTableView*)tableView validateDrop:(id)建议的信息row:(NSInteger)建议的行dropOperation:(NSTableViewDropOperation)dropOperation{
//只允许在上方/下方下降。
return dropOperation==NSTableViewDropOver?(NSDragOperationMove | NSDragOperationCopy):NSDragOperationNone;
}
-(BOOL)tableView:(NSTableView*)tableView acceptDrop:(id)信息行:(NSInteger)行删除操作:(NSTableViewDropOperation)删除操作{
如果(dropOperation==NSTableViewDropOver){
NSPasteboard*粘贴板=[info draggingPasteboard];
NSData*rowData=[pasteboard dataForType:kRowIndexesPasteboardType];
NSIndexSet*rowIndexes=[nsKeyedUnarchiveObjectWithData:rowData];
布尔拷贝=???;
如有(副本){
//将行索引处的项复制到行。
}否则{
//将行索引处的项目移动到行。
}
返回YES;
}
返回否;
}
  • 如何使默认的拖动操作处于移动状态,并仅在按住Option键时进行复制?目前它默认为直接复制
  • tableView:acceptDrop:row:dropOperation:
    中,如何判断该操作是复制操作还是删除操作

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

    在acceptDrop中:选中[info DragingSourceOperationMask]&NSDragOperationMove。

    DragingSourceOperationMask
    的值所述,当未按住修改键时,将
    NSDragOperationEvery
    (除非更改):

    当它回来的时候 将其作为放置验证,而无需用户进行任何修改 用户(无选项键向下),则需要删除任何原始选项 被认为是可能的。然后,您的验证应该选择 您将基于执行的操作(源代码外允许的选项) 对于下降的目标来说,什么是有意义的

    这意味着按下选项键时,以下方法将返回
    nsdragooperationcopy
    ,否则返回
    nsdragooperationmove

    - (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;
    }
    
    -(NSDragOperation)tableView:(NSTableView*)tableView validateDrop:(id)建议的信息row:(NSInteger)建议的行dropOperation:(NSTableViewDropOperation)dropOperation{
    //允许移动或复制行。
    NSDRAGO操作移动或复制=(info.draggingSourceOperationMask==NSDRAGO操作复制?NSDRAGO操作复制:NSDRAGO操作移动);
    //只允许在上方/下方下降。
    return dropOperation==NSTableViewDropOver?移动或复制:NSDragOperationNone;
    }
    

    同样,可以在
    表视图:acceptDrop:row:dropOperation:
    中以类似的方式检查操作。

    仅拖动项目时
    DragingSourceOperationMask
    为-1,这意味着当我只想
    NSDragOperationMove
    时返回
    NSDragOperationCopy&NSDragOperationMove