Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSPasteboard和简单自定义数据_Cocoa_Macos_Nspasteboard - Fatal编程技术网

Cocoa NSPasteboard和简单自定义数据

Cocoa NSPasteboard和简单自定义数据,cocoa,macos,nspasteboard,Cocoa,Macos,Nspasteboard,我很难让NSPasteboard正常工作,所以请原谅我的不理解 我想要的只是一种简单的方法,从粘贴板中写入和检索一个仅适用于我的应用程序的整数值。我所做的只是在我的应用程序中拖放一个项目,所以我在粘贴板中需要的只是项目的id 我曾尝试研究过NSPasteboardItemDataProvider、NSPasteboardItem和NSData,但它们都以复杂的方式完成如此简单的任务。事实上,我不知道做这么简单的事情的正确方法是什么——周围的每个示例似乎都处理字符串类型,或者更复杂的东西。[NSM

我很难让NSPasteboard正常工作,所以请原谅我的不理解

我想要的只是一种简单的方法,从粘贴板中写入和检索一个仅适用于我的应用程序的整数值。我所做的只是在我的应用程序中拖放一个项目,所以我在粘贴板中需要的只是项目的id

我曾尝试研究过NSPasteboardItemDataProvider、NSPasteboardItem和NSData,但它们都以复杂的方式完成如此简单的任务。事实上,我不知道做这么简单的事情的正确方法是什么——周围的每个示例似乎都处理字符串类型,或者更复杂的东西。[NSMutable SetData]选择器似乎也不存在,即使代码中没有警告

如果有人能给我指出正确的方向,我将不胜感激


编辑:我正在使用[dragImage…]来帮助我进行拖动操作。

使用NSPasteboard有两种方法

旧方法:自己将数据固定到电路板上 首先,你必须。您还指定了一个对象,该对象将“拥有”粘贴板,这意味着这是将内容放在粘贴板上的对象

下一步是将数据放在粘贴板上。此步骤是可选的

“可选?!”,你问。是:如果您没有将您声明的任何类型的数据放在粘贴板上,并且粘贴板随后需要该数据(粘贴/删除),则。这被称为承诺数据,当复制(大型)或生成数据的成本很高时,这是很好的

有五种方法可以将东西放在粘贴板上(除了被要求提供它们):

  • 仅适用于纯文本。粘贴板将根据需要将其转换为各种编码
  • 仅适用于属性列表(是的,这是一直强制执行的,因此图像数组不起作用),或者可以在属性列表之间进行转换的对象。这可以包括您自己的对象,如果您在其中实现的话
  • 适用于现有数据类型,例如图像类型(PNG、JPEG等)和A/V类型(MPEG-4等)
  • 只有当您正在拖动/复制的内容已经是一个文件时才是好的
  • 如果您还没有使用文件包装器,您可以安全地忽略这一点
较新的方法:将对象固定到电路板上,让它们自己变成数据 在《雪豹》中引入的新热度,是让你的对象本身能够在粘贴板上书写自己。这确实需要他们知道你想要在粘贴板上看到的关于他们自己的一切,包括标识符

您需要使对象同时符合和

既然您知道了旧的方法,那么编写协议看起来会非常熟悉。然后,粘贴板询问您的对象。(协议还提供了一种承诺类型的方法,而不是立即请求类型的数据。)

要将符合NSPasteboardWriting的对象复制到粘贴板,请向粘贴板发送
clearContents
消息(新方式需要,旧方式可选),然后
WriteObject:
传递要复制的对象数组

正如你所料,阅读协议是相反的。要粘贴,请发送粘贴板。粘贴板询问每个类,然后(可选)尝试

这种方法的缺点是,特别是在涉及重用标识符的情况下,它最终会打破模型层与控制器层的分离。如果希望标识符返回具有该标识符的现有对象,则需要知道如何处理该标识符。这意味着它需要与控制器对话(错误)或复制控制器的查找代码(错误)

我不知道有什么好方法可以用新协议实现移动拖放(包括但不限于重新排序),而不会遇到这个问题。对于复制拖放(包括但不限于跨进程),这很好,因为您不需要标识符,只需在一端生成数据并从另一端创建新副本即可

新方法的好处是,处理多个项目更加理智。在旧的方法中,只有一个“项”——事实上,在多种类型中根本没有任何项的概念。如果要复制或拖动多个对象,可以创建一个数组并将其复制为某个类型的单个属性列表,然后从另一端的单个属性列表中重新创建/检索多个对象。较新的方式明确支持一个或多个项目;复制多个对象时,只需将它们全部传递给
writeObjects:

您的案例:单个整数标识符 将其放入NSNumber(属性列表)中,并以旧的方式使用。

要跟进,请回答,查看我的GitHub端口。此模块处理自定义对象的拖放操作以及与WKWebView的交互


这是一个正在进行的工作,采用了新的闪亮的粘贴板。

您为什么要使用NSPasteboard来实现这样的功能?如果你不想/不需要应用程序之外的数据,这是一个非常糟糕的决定。您应该使用属性、委托、通知或至少是NSUSerDefaults。我仍在学习如何使用Cocoa,因此我可能不会总是选择最佳方法。我正在做一个拖放操作,将一个视图(多个视图)从一个区域移动到另一个区域,因此我认为这是一个很好的实现方法。它还具有通常用于此类操作的良好回滚图像。@fichek:NSPasteboard是实现拖放的一部分。@PeterHosey是的,我后来才注意到他指的是Mac,抱歉:)我在实现新方法时遇到了一些问题。如何将此方法中的自定义对象转换为plist(id)pasteboardPropertyListForType:(NSString*)类型。这与我的问题有关,不幸的是苹果改变了t