J'ai un NSTableView
que je souhaite être capable de faire glisser et déposer des lignes pour les déplacer, et glisser-déposer tout en maintenant Option (selon Apple's documentation) pour les copier.Comment autoriser le déplacement et la copie en faisant glisser des lignes dans un NSTableView?
J'ai le code suivant dans mon contrôleur de vue, qui est également le dataSource
de la vue de table.
- (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;
}
- Comment puis-je faire défaut en faisant glisser l'opération se déplacer et être uniquement une copie lorsque la touche Option enfoncée? Actuellement, il est par défaut de copier tout de suite.
- Dans
tableView:acceptDrop:row:dropOperation:
comment puis-je savoir si l'opération était une opération de copie ou une opération de suppression?
Le 'draggingSourceOperationMask' est -1 quand il suffit de faire glisser l'élément ce qui signifie que' NSDragOperationCopy & NSDragOperationMove' est retourné, quand je veux juste 'NSDragOperationMove'. – DanielGibbs