2015-09-05 28 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

相關問題