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;
}
返回否;
}
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
。