将文件拖放到 NSTableView 上?

Posted

技术标签:

【中文标题】将文件拖放到 NSTableView 上?【英文标题】:Drag-and-drop files onto an NSTableView? 【发布时间】:2010-10-23 13:04:24 【问题描述】:

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

我该怎么做呢?目前,tableview 从数组控制器获取数据(从 NSMutableArray 获取数据)

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

我有..

创建了一个“TableCon”类(我改为继承自 NSTableView,而不是 NSObject) 将 NSTableView 类更改为 TableCon 将 NSTableView 的代理出口设置为该类 在 TableCon 的初始化中调用 registerForDraggedTypes 已实现 - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender;(再次在 TableCon 中)

..但是,什么都没有,它就像我从未改变任何东西(没有错误),我做错了什么?

编辑:我已经尝试实施 Boaz Stuller 的建议,还找到了解决方案的 this 描述(first reply 包含第一篇文章的解决方案)。所以我现在做的是..

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

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

【问题讨论】:

这些是数据源方法。您需要将表视图的 dataSource 出口连接到实现这些方法的类,以便调用它们。 噢,那是我做错了!我假设“数据源”是指阵列控制器!现在一切正常,您可以将该信息添加到您的答案中以便我接受吗?谢谢波阿斯! 【参考方案1】:

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

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

请注意,这些是数据源方法。您需要将 table view 的 dataSource outlet 连接到实现这些方法的类,以便调用它们。

【讨论】:

不幸的是,您的第一个链接现在似乎已失效。我不确定替换的是什么。【参考方案2】:

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

【讨论】:

以上是关于将文件拖放到 NSTableView 上?的主要内容,如果未能解决你的问题,请参考以下文章

Swift NSTableview 拖动选择多行而不是拖出表格

在 Mac 上,将文件拖到我的 NSTableVIew?

NSTableView 并从 Finder 拖放

拖出 NSTableView 以移除

macOS - 如何在NSTableView中使用复选框?

创建批处理文件以将文件拖放到exe上