1

我使用 Apple 的示例“大纲视图”作为文件浏览器。我有一个 DataSource 和 FileSystemItem,就像 Apple 写的一样。我无法单击按住然后拖动文件名或文件夹名称。当我单击时, selectedRow 变为蓝色。正如我所持有的,什么也没有发生。如果我在按住时移动,蓝线会滚动文件列表。

我已经浏览了 Apple 的“Drag N Drop Outline View”代码,这不是我想要的。我不想重新排序文件并将它们从 OutlineView 中拖动。我想将文件名(最终是它的路径)拖到 NSTextfield。我无法让 NSOutlineView 注册拖动操作。

我已经将 NSOutlineView 子类化并尝试过:

- (void)awakeFromNib {
    [_outlineView registerForDraggedTypes:[NSArray arrayWithObjects:LOCAL_REORDER_PASTEBOARD_TYPE, NSStringPboardType, NSFilenamesPboardType, nil]];
    [_outlineView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:YES];
}

以及 -(NSDragOperation)、draggingEntered、-(void)registerForDraggedTypes 等...

无需任何特殊代码即可将文本从 NSScrollView 拖动到此 NSTextField。显然一个 NSOutlineView 没有继承 NSScrollView 的原生拖动能力?

那么我怎样才能得到一个 NSOutlineView 来允许我拖动。同样,Apple 的 DragNDropOutlineView 做的比我想要的要多,没有做我想做的事,也没有帮助我弄清楚如何获得这种拖动能力。

4

1 回答 1

1

你可以这样声明你registerForDraggedTypes

[outline_view registerForDraggedTypes:[NSArray arrayWithObjects:LOCAL_REORDER_PASTEBOARD_TYPE,NSColorPboardType,NSDragPboard, nil]];

并且你需要实现这个方法来执行拖拽操作NSOutlineView

- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pasteboard
{

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:items];
    [pasteboard declareTypes:[NSArray arrayWithObject:LOCAL_REORDER_PASTEBOARD_TYPE] owner:self];
    [pasteboard setData:data forType:LOCAL_REORDER_PASTEBOARD_TYPE];
    return YES;   
}

这将允许拖动NSOutlineView行..

于 2012-09-04T07:17:52.723 回答