我正在尝试为我的NSTableView设置非常基本的拖放功能。表视图有一列(带有自定义单元格)。该列绑定到NSArrayController,并且数组控制器的内容数组绑定到我的控制器对象上的NSArray。表中的数据显示正常。我将表视图的dataSource
和delegate
出口连接到我的控制器对象,然后实现了这些方法:
- (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的自定义单元格进行拖动工作。现在,如何使用自定义单元格拖放工作?答案 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
来猜测使其工作的人是可行的,因为单元格类型不同。