NSTableView拖放无法正常工作

时间:2011-01-13 00:39:23

标签: objective-c cocoa nstableview nsarraycontroller nscell

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

- (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的自定义单元格进行拖动工作。现在,如何使用自定义单元格拖放工作

7 个答案:

答案 0 :(得分:3)

我正在撞墙,为同样的问题找到一个更优雅的解决方案,然后我遇到了这个:

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

  

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

是的。如果您已将所有内容绑定到阵列控制器,那么您可以做的是让阵列控制器实现必要的拖放功能,然后使用{{将表视图的数据源设置到阵列控制器1}}。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我遇到了这个问题,如果你想让拖放工作正常,你的自定义单元格需要扩展NSActionCell而不是NSCell。你可以在NSCell中实现一些可以使它全部工作的东西,但在切换到NSActionCell后我没有进一步挖掘。至少,这为我解决了这个问题。

答案 5 :(得分:0)

我也观察到类似的问题,NStableView drag&amp;掉线不起作用。我的tableview中有4列,其中两列是自定义单元格。拖动非自定义单元格工作正常,即使它在单元格分隔符上工作,但它不能使用自定义单元格。

  

我的自定义单元格是从NSButtonCell子类化的,这导致了   问题。正如所建议的那样,我将我的父类从NSButtonCell更改为   NSActionCell。现在,拖动工作正常。

它既适用于NSCell,也适用于NSActionCell,但我需要对我的单元格采取措施,因此使用了NSActionCell。

答案 6 :(得分:0)

我遇到了这个问题。我有一个NSCell子类,我确实实现了tableView:writeRowsWithIndexes:toPasteboard,并为NSTableView设置了dataSource。拖动不起作用。

如果我在init中为自定义子类设置单元格类型

    self.type = NSTextCellType;

然后我拖了。如果我不这样做,则默认为NSNullCellType,并且拖动功能无效。我通过使用另一个子类NSTextFieldCell来猜测使其工作的人是可行的,因为单元格类型不同。