3

我正在尝试为我的 NSTableView 设置非常基本的拖放操作。表格视图只有一列(带有自定义单元格)。该列绑定到 NSArrayController,而数组控制器的内容数组绑定到我的控制器对象上的 NSArray。数据在表中显示良好。我将 table view 的dataSourcedelegateoutlets 连接到我的控制器对象,然后实现了这些方法:

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard
{
    NSLog(@"dragging");
    return YES;
}

- (NSDragOperation)tableView:(NSTableView*)tv validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)op
{
    return NSDragOperationEvery;
}

- (BOOL)tableView:(NSTableView *)aTableView acceptDrop:(id <NSDraggingInfo>)info
              row:(NSInteger)row dropOperation:(NSTableViewDropOperation)operation
{
    return YES;
}

我还在以下位置注册了拖动类型-awakeFromNib

#define MyDragType @"MyDragType"

- (void)awakeFromNib
{
    [super awakeFromNib];
    [_myTable registerForDraggedTypes:[NSArray arrayWithObjects:MyDragType, nil]];
}

问题是 -tableView:writeRowsWithIndexes:toPasteboard: 方法从未被调用过。我看过一堆例子,但我无法弄清楚我做错了什么。问题可能是我正在使用自定义单元格吗?我应该在单元子类中覆盖某些东西以启用此功能吗?

编辑:确认。将自定义单元格切换为常规 NSTextFieldCell 可以进行拖动。现在,如何使用自定义单元格进行拖放操作

4

7 回答 7

3

我正在把头撞在墙上,寻找更优雅的解决方案来解决同样的问题,然后我遇到了这个:

http://www.wooji-juice.com/blog/cocoa-10-bindings.html

例如,如果你想支持从表中拖放,你需要为它设置一个数据源——即使你使用绑定来提供实际数据,你也可以在它上面设置一个数据源,而 Cocoa 需要一个来处理tableView:writeRowsWithIndexes:toPasteboard和相关的消息。

是的。如果您已将所有内容绑定到数组控制器,您可以做的是让数组控制器实现必要的拖放功能,然后将表格视图的数据源设置为数组控制器setDataSource:

于 2014-08-04T07:24:36.767 回答
2

我解决了这个问题。在表格视图中使用带有自定义 NSCell 的绑定似乎存在问题。切换到传统NSTableViewDataSource方法而不是绑定和数组控制器解决了它。

于 2011-01-13T04:35:13.563 回答
2

对我有用的是在我的自定义单元格(在我的例子中是 init)的初始化程序中调用 initTextCell 而不是 init 或 initImageCell 。超类是 NSCell 还是 NSActionCell 似乎并不重要。另外,我有绑定,并且拖动仍然有效。

于 2012-07-17T00:49:04.203 回答
1

这应该足以让拖动开始。你确定你已经连接了委托方法吗?

于 2011-01-13T02:09:19.353 回答
0

我遇到了这个问题,如果您希望拖放正常工作,您的自定义单元格NSActionCell不需要扩展。NSCell可能有一些你可以实现的东西也可以NSCell让它全部工作,但在切换到NSActionCell. 至少,这为我解决了这个问题。

于 2011-01-13T18:48:39.907 回答
0

我也观察到类似的问题,NStableView 拖放不起作用。我的表格视图中有 4 列,其中两个是自定义单元格。非自定义单元格的拖动工作正常,即使它也适用于单元格分隔符,但它不适用于自定义单元格。

我的自定义单元格是导致问题的 NSButtonCell 的子类。因此,按照建议,我将父类从 NSButtonCell 更改为 NSActionCell。现在,拖动工作完美。

它适用于 NSCell 和 NSActionCell,但是我需要对我的单元格进行操作,因此使用了 NSActionCell。

于 2014-09-10T13:05:27.350 回答
0

我遇到了这个问题。我有一个 NSCell 子类,我确实实现了tableView:writeRowsWithIndexes:toPasteboard ,并且为 NSTableView 设置了数据源。拖动是行不通的。

如果我在我的初始化中为自定义子类设置单元格类型

    self.type = NSTextCellType;

然后我就拖了。如果我不这样做,它默认为NSNullCellType并且拖动不起作用。我猜那些通过使用另一个子类来工作的人是NSTextFieldCell因为细胞类型不同。

于 2014-12-13T00:48:27.600 回答