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

     2023-05-08     24

关键词:

【中文标题】使用核心数据存储对 NSTableView 的拖放支持【英文标题】:Drag'n'Drop Support for NSTableView with CoreData Storage 【发布时间】:2010-11-25 20:43:35 【问题描述】:

我必须在我的应用程序中的 NSTableViews 都显示存储为“CoreData”的数据。 TableViews 是非常基本的,就像整个程序一样。

右边的 TableView 显示了一个清单列表,左边显示了这个清单的内容。 现在我想允许用户将清单内的项目拖到另一个清单中。

我在网上找到了一些教程和示例代码,但对于我对 Cocoa 的理解来说,它们是压倒性的。如果有人可以通过简短易懂的说明提及网页或教程等,那就太好了。

非常感谢

编辑: 虽然应该很明显,但我的应用程序是用 Cocoa 编写并在 Mac 上运行的。

【问题讨论】:

【参考方案1】:

我的下载页面上有一个关于如何通过拖放使用 NSOutlineView 的小演示:http://davedelong.com/downloads 它应该非常适用于 NSTableView,因为 NSOutlineView 是 NSTableView 的子类。

这是我在阅读文档大约一个月后所学到的知识的 5 分钟提炼。从 NSTableView 拖放内容时,使用了三种“基本”的 NSTableView 委托方法。它们是:

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

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

    - (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard;

第一个 tableView:acceptDrop:row:dropOperation: 用于当有人将某些东西拖到您的 NSTableView 上时。这很简单。在[info draggingPasteboard] 中可以找到有关丢弃的所有信息(包括被丢弃的内容)。如果删除成功返回YES,否则返回NO

tableView:validateDrop:proposedRow:proposedDropOperation: 用于当有人想要将某些东西放到您的 NSTableView 上时。在这一点上,drop 的发起者并不重要。重要的是他们在你身上徘徊,你必须说出他们能做什么。例如,如果它们悬停在某一行(“proposedRow”)上,并且您不想让内容被放在该行上,则返回 NSDragOperationNone。或者,也许您想复制信息中的内容(返回 NSDragOperationCopy)。有a whole bunch of different kinds of operations you can signify。使用适合您需要的一种。 (这些返回值会相应地调整光标。因此,如果您返回 NSDragOperationCopy,那么光标将得到小绿色+ 圆圈。)

当用户在 NSTableView 中选择了一些行并开始拖动它们时,将调用最后一个方法 tableView:writeRowsWithIndexes:toPasteboard:。您现在必须为拖动的粘贴板提供与这些行对应的信息,以便可以将其拖放到其他位置。这是我如何使用此方法向粘贴板提供 NSManagedObjects 的简化示例:

- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard 
  [pboard declareTypes:[NSArray arrayWithObject:kMyCustomDragType] owner:self];
  //get an array of URIs for the selected objects
  NSMutableArray * rows = [NSMutableArray array];
  NSArray * selectedObjects = [arrayOfManagedObjects objectsAtIndexes:rowIndexes];
  for (NSManagedObject * o in selectedObjects) 
    [rows addObject:[[o objectID] URIRepresentation]];
  
  NSData * encodedIDs = [NSKeyedArchiver archivedDataWithRootObject:rows];
  [pboard setData:encodedIDs forType:kMyCustomDragType];
  return YES;

这背后的想法是,我正在对每个选定的 NSManagedObject 的 objectID 的 URIRepresentation 进行编码,并将其放在粘贴板上。我将这些数据放在“kMyCustomDragType”(NSString)类型下的 draggingPasteboard 上,这意味着只有表明它们接受 kMyCustomDragType 类型的 drop 的对象才能接收到这个 drop。我终于返回YES,表示我已成功将数据写入粘贴板。 (失败返回NO

如果您可以让它工作,那么您可能已经获得了您需要的所有拖放功能的 90%。其他 10% 将来自陌生人的需求。一如既往,the documentation will be your best friend。

【讨论】:

感谢大卫提供的非常的帮助。这对我帮助很大。 竖起大拇指 我想知道你是否可以包括一个使用tableView:pasteboardWriterForRow:(而不是tableView:writeRowsWithIndexes:toPasteboard:)的例子,并说明键值编码是否是绝对必要的。

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

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

什么是“用鼠标移动东西”中的拖放,而不是数据传输中的拖放?

...题描述】:我正在尝试在C#和Java中实现拖放,以允许用户使用鼠标移动视觉元素,但我在Google上找 查看详情

我如何使用 CGAffineTransform 进行正确的拖放

】我如何使用CGAffineTransform进行正确的拖放【英文标题】:HowicanuseCGAffineTransformforcorrectdraganddrop【发布时间】:2019-02-0722:27:44【问题描述】:我想通过UIPanGestureRecognizer对UITextView进行拖放,并在屏幕中心自动对齐。第一次拖动效... 查看详情

Qt5:使用 QSortFilterProxyModel 时的拖放

】Qt5:使用QSortFilterProxyModel时的拖放【英文标题】:Qt5:DragandDropwhenusingQSortFilterProxyModel【发布时间】:2017-07-2711:20:43【问题描述】:我有一个从QAbstractListModel子类化的模型,它具有不同的Listviews,这些Listviews使用子类QSortFilterProx... 查看详情

将 TableView 的拖放 API 与底层值类型数据对象一起使用

】将TableView的拖放API与底层值类型数据对象一起使用【英文标题】:UsingTableView\'sDrag&DropAPIwithunderlyingvaluetypedataobjects【发布时间】:2021-11-0912:53:38【问题描述】:在iOS11中,Apple通过NSItemProvider类向操作系统引入了拖放API(主... 查看详情

单击拖放功能

...问题描述】:我正在创建一个非常简单的拖放应用程序。使用html5的拖放功能可以在桌面上完美运行。我想复制使用click(select)和click(target,drop)的拖放功能。我想要发生的事情。您单击要移动的元素(即在移动情况下使用鼠标或手... 查看详情

在 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... 查看详情

html5中的拖放

...gable=“true”  ②编写有关拖放事件的处理函数。2.使用dataTransfer对象  dataTransfer对象是事件对象的一个属性,用于从被拖拽元素向放置目标传递字符串格式的数据。因为是事件对象的属性,在拖放事件的事件处理程... 查看详情

Eclipse 中的拖放可视化编辑器

...前的项目中,我编写了高级规范(如下所示以供参考)并使用用ANTLR编写的语法对其进行解析,然后使用StringTempate生成等效的Java编程代码。现在,我的客户发现编写此文本高级规范很困难,并希望我提供等效的可视拖放编程结... 查看详情

使用大约 500.000 条记录的 NSTableView 进行高效的核心数据处理

】使用大约500.000条记录的NSTableView进行高效的核心数据处理【英文标题】:EfficientCoreDatahandlingusingNSTableViewwitharound500.000records【发布时间】:2014-03-3009:44:47【问题描述】:大家早上好,我使用CoreData和TICoreDataSync库(http://timisted.gith... 查看详情

限制数据网格中某些项目的拖放? - 土坯柔性

】限制数据网格中某些项目的拖放?-土坯柔性【英文标题】:Restrictdraganddropofsomeitemsinadatagrid?-AdobeFlex【发布时间】:2017-05-2904:19:09【问题描述】:我想限制数据网格中特定项目的拖放。并非所有项目都将添加到数据网格中。例... 查看详情

h5中元素的拖放

...定当元素被拖动的时候会发生什么方法:dataTransfer.setData(数据类型,可拖动元素的id)—-设置被拖数据的数据类型和值<!--img可以拖动,拖动时调用函数 查看详情

使用 IStream 拖放虚拟文件

】使用IStream拖放虚拟文件【英文标题】:DraganddropvirtualfilesusingIStream【发布时间】:2010-11-1407:39:32【问题描述】:我想启用从基于Windows窗体的应用程序到Windows资源管理器的拖放功能。大问题:文件存储在数据库中,所以我需要... 查看详情

在 Asp.net 中使用 HTML5 的拖放上传文件

】在Asp.net中使用HTML5的拖放上传文件【英文标题】:FileuploadusingHTML5\'sdraganddropinAsp.net【发布时间】:2013-08-2410:49:41【问题描述】:我正在尝试使用HTML5的DnD和FileAPI上传文件。我不确定如何将表单数据发送到服务器,我尝试使用XM... 查看详情

如何实现 Android 标记的拖放?

...droid中的MapView应用程序。我有三个标记,我希望稍后能够使用GoogleMapAPIgetlocation-function。为了尝试一下,我想使用拖放功能移动标记,然后检查位置。任何已经通过拖放操作来处 查看详情

使用 .Net 检测外部应用程序中的拖放操作

】使用.Net检测外部应用程序中的拖放操作【英文标题】:Detectdraganddropoperationsinanexternalapplicationusing.Net【发布时间】:2010-12-1707:29:06【问题描述】:我需要检测外部应用程序中的拖放操作,可以吗?我想写一个钩子来检测这些操... 查看详情

ubuntu使用了无效的拖放类型

Ubuntu是一款基于Linux内核的开源操作系统,其中使用了一种叫做“无效拖放类型”的设计原则。所谓“无效拖放类型”,指的是当用户将某个文件或文件夹拖放到其他位置时,Ubuntu会尝试在被拖放的位置创建一个临时的链接文件... 查看详情