NSTableView 并从 Finder 拖放

     2023-05-08     71

关键词:

【中文标题】NSTableView 并从 Finder 拖放【英文标题】:NSTableView and drag and drop from Finder 【发布时间】:2012-05-05 16:27:29 【问题描述】:

我正在尝试将 Finder 拖放到我的应用程序的 NSTableView 中。该设置使用NSTableView,这是一个数组控制器,它使用 Cocoa 绑定到 Core Data 存储充当数据源。

我做了以下,基本上是按照我在 SO 和其他网站上找到的各种博客文章:

在我调用的视图控制器的awakeFromNib 中:

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObjects: NSPasteboardTypePNG, nil]];

我对 NSArrayController 进行了子类化,并将以下方法添加到我的子类中(子类化的原因是数组控制器需要被告知 drop,因为它充当表视图的数据源):

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

我的上述实现目前只写入日志,然后返回布尔值 YES。

- (NSDragOperation) tableView: (NSTableView *) aTableView validateDrop: (id < NSDraggingInfo >) info proposedRow: (NSInteger) row proposedDropOperation: (NSTableViewDropOperation) operation

在 IB 中,数组控制器指向我的自定义 NSArrayController 子类。

结果:没有。当我将一个 PNG 从桌面拖到我的表格视图上时,什么也没有发生,文件很高兴地弹回了它的原点。我一定做错了什么,但不明白是什么。我哪里错了?

【问题讨论】:

【参考方案1】:

从 Finder 中拖动始终是文件拖动,而不是图像拖动。您需要支持从 Finder 中拖动 URL。

为此,您需要声明您需要 URL 类型:

[[self sourcesTableView] registerForDraggedTypes:[NSArray arrayWithObject:(NSString*)kUTTypeFileURL]];

您可以像这样验证文件:

 - (NSDragOperation)tableView:(NSTableView *)aTableView validateDrop:(id < NSDraggingInfo >)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)operation

    //get the file URLs from the pasteboard
    NSPasteboard* pb = info.draggingPasteboard;

    //list the file type UTIs we want to accept
    NSArray* acceptedTypes = [NSArray arrayWithObject:(NSString*)kUTTypeImage];

    NSArray* urls = [pb readObjectsForClasses:[NSArray arrayWithObject:[NSURL class]]
     options:[NSDictionary dictionaryWithObjectsAndKeys:
                [NSNumber numberWithBool:YES],NSPasteboardURLReadingFileURLsOnlyKey,
                acceptedTypes, NSPasteboardURLReadingContentsConformToTypesKey,
                nil]];

    //only allow drag if there is exactly one file
    if(urls.count != 1)
        return NSDragOperationNone;

    return NSDragOperationCopy;

然后,当调用 tableView:acceptDrop:row:dropOperation: 方法时,您需要再次提取 URL,从 URL 创建一个图像,然后对该图像执行一些操作。

即使您使用的是 Cocoa 绑定,如果您想使用拖动方法,您仍然需要分配和实现一个对象作为您的 NSTableViewdatasource。子类化NSTableView 不会有好处,因为NSTableView 中没有实现数据源方法。

您只需要在您的数据源对象中实现与拖动相关的方法,而不是那些提供表格数据的方法,因为您使用绑定来执行此操作。您有责任通过调用 NSArrayController 方法之一(例如 insertObject:atArrangedObjectIndex:)或通过使用符合键值编码的访问器方法修改后备数组来通知数组控制器删除结果。

【讨论】:

谢谢,但表格视图仍然不接受任何拖放操作。我从 Finder 中拖动的任何文件都会反弹回来……我确实使用 Cocoa 绑定将表格附加到其数据源。 我已经更新了我的答案。您仍然需要实现一个数据源对象。

在 NSTableView 中实现拖放

】在NSTableView中实现拖放【英文标题】:ImplementingdraganddropinNSTableView【发布时间】:2011-08-2206:29:32【问题描述】:谁能帮我?我在下面使用了这段代码,但这些方法在执行期间没有被调用。-(BOOL)tableView:(NSTableView*)tvwriteRowsWithIndexe... 查看详情

NSTableView 和 NSOutlineView 拖放

】NSTableView和NSOutlineView拖放【英文标题】:NSTableViewandNSOutlineViewdrag-and-drop【发布时间】:2010-10-1313:22:54【问题描述】:我有一个NSTableView和一个NSOutlineView,它们的内容都由绑定提供,我想要一些拖放功能:将表A中的行拖到大纲B... 查看详情

nstableview 拖放与自定义单元格视图

】nstableview拖放与自定义单元格视图【英文标题】:nstableviewdraganddropwithcustomcellviews【发布时间】:2017-11-1306:10:48【问题描述】:我使用swift3forosx,我正在寻找不同视图控制器中两个NSTableView之间的拖放解决方案。我有一个简单的... 查看详情

在 NSTableView 上拖放重新排序行

】在NSTableView上拖放重新排序行【英文标题】:Drag&DropReorderRowsonNSTableView【发布时间】:2011-01-0811:28:54【问题描述】:我只是想知道是否有一种简单的方法可以设置NSTableView以允许它重新排序其行而无需编写任何粘贴板代码。... 查看详情

在拖放期间在 NSTableView 中打开一个间隙

】在拖放期间在NSTableView中打开一个间隙【英文标题】:OpeningagapinNSTableViewduringdraganddrop【发布时间】:2012-04-2522:14:10【问题描述】:我有一个简单的、单列、基于视图的NSTableView,其中包含可以拖动以重新排序的项目。在拖放过... 查看详情

使用核心数据存储对 NSTableView 的拖放支持

】使用核心数据存储对NSTableView的拖放支持【英文标题】:Drag\'n\'DropSupportforNSTableViewwithCoreDataStorage【发布时间】:2010-11-2520:43:35【问题描述】:我必须在我的应用程序中的NSTableViews都显示存储为“CoreData”的数据。TableViews是非... 查看详情

拖出 NSTableView 以移除

】拖出NSTableView以移除【英文标题】:DraggingoutofNSTableViewtoRemove【发布时间】:2011-12-0403:44:41【问题描述】:我有一个NSTableView,其中包含许多项目。我想实现从inside拖动并将outside拖放到NSTableView以删除拖动的项目。(有点像Safari... 查看详情

如何在 Mac OS X 10.5 中处理从 Finder 中的多个文件拖放?

】如何在MacOSX10.5中处理从Finder中的多个文件拖放?【英文标题】:HowdoIhandlemultiplefiledrag/dropfromFinderinMacOSX10.5?【发布时间】:2011-01-0104:10:14【问题描述】:我需要从Finder中获取所有拖放到我的应用程序中的文件的URL。我有一个在... 查看详情

快速将数据加载到 NSTableView

】快速将数据加载到NSTableView【英文标题】:LoaddatatoNSTableViewinswift【发布时间】:2014-12-1009:48:48【问题描述】:我是IOS/IOX开发的新手。我尝试了许多网站使用NSTableView将数据加载到我在OSXswift上的表中。但一切都失败了。我所做... 查看详情

隐藏底部 HTML/widget,并从 Streamlit file_uploader() 中删除拖放

】隐藏底部HTML/widget,并从Streamlitfile_uploader()中删除拖放【英文标题】:HidebottomHTML/widget,andremoveDrag&DropfromStreamlitfile_uploader()【发布时间】:2021-03-0623:33:38【问题描述】:我使用Streamlit创建了一个应用程序,它需要一次读取多... 查看详情

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

】SwiftNSTableview拖动选择多行而不是拖出表格【英文标题】:SwiftNSTableviewDragSelectsMultipleRowsInsteadofDraggingOutofTable【发布时间】:2020-01-1207:29:33【问题描述】:我正在尝试将文件从NSTableView拖放到Finder上。当我尝试拖动一行时,除了... 查看详情

使用 NSStatusItem 拖放

...在尝试编写一个应用程序,该应用程序允许用户将文件从Finder拖放到NSStatusItem上。到目前为止,我已经创建了一个实现拖放界面的自定义视图。当我将此视图添加为NSWindow的子视图时,它一切正常——鼠标光标提供适当的反馈,... 查看详情

JTable - 拖放

...播放列表或iTunes中的播放列表。我从操作系统(Explorer、Finder等)中删除文件工作得很好,但是一旦文件进入,我就无法重新安排表 查看详情

c#拖放功能

...我想制作一个应用程序,用户可以在其中将文件从他们的finder(mac)或他们的计算机资源管理器(PC)拖到我应用程序上的某个位置,然后将该拖动的文件加载到应用。我无法访问任何拖放事件(据说),因为我正在为所有GUI使用渲染... 查看详情

在nstableview中使用第一列拖动图像(代码片段)

...信息。我在示例应用程序中缺少什么才能使其工作?答案NSTableView拖动拖动开始的列,NSOutlineView拖动轮廓列。如果你想改变图像,子类NSTableView并覆盖dragImageForRows(with:tableColumns:event:offset:)。 查看详情

Qt4是不是实现了窗口图标的拖放?

...的一些窗口具有可拖放的窗口图标(例如终端、Keynote、Finder)。Qt4窗口图标可以设置拖放吗?我不知道点击窗口图标是否会触发任何事件。【问题讨论】:【参考方案1】:由于此功能仅适用于一个平台 查看详情

NSTableView:创建“重叠”行

】NSTableView:创建“重叠”行【英文标题】:NSTableView:Create"Overlapping"Rows【发布时间】:2016-07-1822:58:28【问题描述】:目标我的应用中有一个NSTableView,我想绘制“重叠”行以创建类似于Automator.app中的“连接”效果:我正... 查看详情

NSTableView 意外调整大小

】NSTableView意外调整大小【英文标题】:NSTableViewresizingunexpectedly【发布时间】:2019-02-2722:46:51【问题描述】:我有一个基于单元格的NSTableView,当我继续向表中添加更多项目时,它意外地垂直调整大小。我已经实现了约束,但它... 查看详情