2015-09-05 46 views
2

我有一个NSTableView,我希望能够拖放行来移动它们,并拖拽时按住Option(按照Apple's documentation)复制它们。如何通过在NST​​ableView中拖动行来允许移动和复制?

我在我的视图控制器,这也是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. 我怎样才能使默认的拖动操作是移动的,当选项键被按下只被复制?目前它默认为直接复制。
  2. tableView:acceptDrop:row:dropOperation:如何判断操作是复制操作还是放置操作?

回答

2

this discussion描述draggingSourceOperationMask值将是NSDragOperationEvery(除非改变)时,没有修饰键举行:

当由 回来 你的表作为降验证没有任何修饰用户(没有选项键下来),那么任何原始选项需要被认为是可能的 。然后,您的验证应该根据 选择 操作(超出源允许的选项),以便确定放置目标的合理性。

这意味着当Option键被按下后,下面的方法将返回NSDragOperationCopyNSDragOperationMove否则:

- (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:以类似的方式进行检查。

0

在validateDrop:回报[信息draggingSourceOperationMask] &(NSDragOperationMove | NSDragOperationCopy)或NSDragOperationNone。

In acceptDrop:check [info draggingSourceOperationMask] & NSDragOperationMove。

+0

拖动这个项目时'draggingSourceOperationMask'为-1,这意味着当我只想'NSDragOperationMove'时,返回'NSDragOperationCopy&NSDragOperationMove'。 – DanielGibbs

相关问题