2010-09-23 43 views
4

是否可以在拖放操作中将指针传递给对象?在拖放操作中传递对象指针

这里的情景......

我有自定义对象的“NSArray的”。为了参数,我们会说这是一个人物对象列表。

该列表通过NSArrayController绑定到NSTableViewNSTableView是一个拖动源,我有一个NSView作为拖动目标。

实施拖放操作时,我可以在拖动过程中轻松地从NSArrayController获取当前选定人员的姓名,并将其传递给NSView中的接收人,作为NSString

但是,我希望能够将指针传递给person对象,以便接收者可以访问整个对象。

问题似乎是,拖动操作创建人物对象的新实例,尽管在人物模型中实现了所需方法,但并未引用所选人物对象。因此,我在目的地得到一个人物对象,它只是不填充来自对象的数据。

理想情况下,我想要对象指针,因为NSView将使用对象引用,以便对象本身的任何更新都反映在NSViewNSTableView(以及使用该对象的任何其他位置)中。

它甚至可以在拖放操作中使用对象引用,还是需要传递一些自定义引用,它是人物对象的iVar,然后在到达目的地后执行查找? (这对我考虑Obj-c有多少对象引用似乎有点过时)。

我知道一个目标可以接受来自应用程序外部的拖动操作,但是将操作指定为本地操作会解释这种情况吗?

我检查了苹果文档,但仍似乎无法找到答案。

Drag and Drop Programming Topics

Pasteboard Programming Guide

任何和所有帮助非常感谢。

回答

3

粘贴板只是不同类型数据的容器,所以无论您放在粘贴板上,都必须将其转换为某种类型的数据。

您需要的是给每个Person对象一个标识符,并将它放在自定义发明的类型标识符下的粘贴板上。一般来说,这样的标识符应该是你的应用程序的包标识符(应该是你的域名加上你的应用程序名称的反面 - 例如com.example.surfwriter)加上类型名称(例如,com.example.surfwriter .tabstop)。

收到放置时,请检查此类型。如果存在,请查找正确的对象,并执行您应有的任何操作。从表视图拖动到同一个表视图应通过将对象移动或复制到新行来实现此目的。

不要使用对象的地址 - 即对象本身 - 作为它的标识符。如果对象死亡(例如,被删除),则地址将不再有效,或者可能引用不同的对象(其可能与原始对象的类别相同或不同)。使用你可以查找并安全找不到的东西。这适用于剪切/复制和粘贴多于拖动,但你可以并且应该使用几乎相同的代码处理两者。

+0

谢谢彼得!看起来我正盯着正确的道路 - 只是没有走得太远而已。很高兴知道不使用对象本身的地址 - 我只是在研究这是否是一种可行的选择。时机就是一切! :-) – Hooligancat 2010-09-23 05:04:26

+0

彼得,只是为了让你知道,工作完美。 :-) 谢谢!!我结束了在我拥有的全局方法类中创建标识符前缀。然后每个模型都有一个'pasteboardRef'方法,它返回它自己的类名和对象的唯一ID。然后,它通过粘贴板发送并拾取到目的地并解析出来,以返回类和ID。发挥魅力! – Hooligancat 2010-09-24 21:24:36