将文件拖放到NSTableView上?

时间:2009-05-04 01:59:10

标签: objective-c cocoa drag-and-drop

我有NSTableView我希望允许用户将视频文件拖放到其中。当他们删除文件时,它将在表视图中添加为一行。

我该怎么做呢?目前tableview的数据来自一个数组控制器(从NSMutableArray获取数据)

我找到了this文档,但似乎无法使其正常工作..

我有..

  • 制作了一个“TableCon”类(我改为继承自NSTableView,而不是NSObject)
  • 将NSTableView类更改为TableCon
  • 将NSTableView的委托出口设置为该类
  • 在TableCon的init
  • 中调用registerForDraggedTypes
  • 实施- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;(再次在TableCon中)

..但是,没有,它表现得像我从未改变过任何事情(没有错误),我做错了什么?

修改:我已尝试实施Boaz Stuller的建议,并且还找到了this解决方案的说明(first reply包含第一篇文章的解决方案)。所以我现在所做的就是......

  • 子类NSArrayController,它将内容提供给表视图(TableListCon)
  • tableView出口添加到TableListCon(并将其指向NSTableView)
  • 在TableListCon
  • 中实现validateDrop,writeRowsWithIndexes和acceptDrop
  • 在tableView outlet上调用registerForDraggedTypes。

同样,没有错误/警告,但似乎只调用了awakeFromNib方法(没有调用其他方法)

2 个答案:

答案 0 :(得分:21)

NSTableView处理拖放操作的方式与通用视图不同,这总体上是一件好事。这意味着您不必手动处理表所需的复杂突出显示,单元格跟踪和插入行为。

可以找到所需内容的说明here。基本上,您仍然调用-registerDraggedTypes :(通常在您的-awakeFromNib方法中),但不是实现NSDraggingDestination方法,而是实现与拖放相关联的各种数据源方法,可以找到here。您不需要将NSTableView子类化为以这种方式实现拖放。

请注意这些是数据源方法。您需要将表视图的dataSource出口挂钩到实现这些方法的类,以便调用它们。

答案 1 :(得分:1)

除了Boaz所说的,听起来你正在创建一个NSTableView子类,然后将该子类的实例作为NSTableView的委托。如果您要进行子类化,则应使用该子类代替NSTableView,而不是使用它。此外,将视图作为另一个对象的委托也几乎总是违反问题。