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 dragSourceOperationMask] & (NSDragOperationMove | NSDragOperationCopy) または NSDragOperationNone を返します。

acceptDrop: [info dragingSourceOperationMask] & NSDragOperationMove を確認します。

于 2015-09-05T11:40:13.610 に答える