gpt4 book ai didi

cocoa - 对带有核心数据存储的 NSTableView 的拖放支持

转载 作者:行者123 更新时间:2023-12-03 16:12:13 26 4
gpt4 key购买 nike

我的应用程序中的 NSTableViews 都必须显示存储为“CoreData”的数据。正如整个程序一样,TableView 非常基本。

右侧 TableView 显示 list 列表,左侧显示此 list 的内容。现在我想允许用户将 list 内的项目拖动到另一个 list 。

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

非常感谢

编辑:尽管很明显,我的应用程序是用 Cocoa 编写的并在 Mac 上运行。

最佳答案

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

以下是我在阅读大约一个月的文档后所学到的内容的 5 分钟提炼。从 NSTableView 拖放内容时使用三种“基本”NSTableView 委托(delegate)方法。他们是:

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

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

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

第一个,tableView:acceptDrop:row:dropOperation:当有人将某些东西拖到你的 NSTableView 上时使用。这非常简单。有关掉落的所有信息(包括掉落的内容)可在 [info draggingPasteboard] 中找到。 。返回YES如果删除成功,并且 NO否则。

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

final方法,tableView:writeRowsWithIndexes:toPasteboard:当用户在 NSTableView 中选择了某些行并开始拖动它们时调用。现在,您必须向拖动粘贴板提供与这些行相对应的信息,以便可以将其拖放到其他地方。下面是我如何使用此方法向粘贴板提供 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 类型的拖放的对象才能够接收此拖放。我终于回来了YES表明我已成功将数据写入粘贴板。 (如果失败则返回NO)

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

关于cocoa - 对带有核心数据存储的 NSTableView 的拖放支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1383021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com