剪贴板UIPasteboard

剪贴板的分类

剪贴板分为系统的和app私有的

剪贴板必须有个名字。系统的剪贴板有两个,一个叫UIPasteboardNameGeneral,一个叫UIPasteboardNameFind,它们的使用场合不一样。

通过 generalPasteboard可以获得名字为UIPasteboardNameGeneral的剪贴板,通常用来复制、剪切和粘贴。
一个创建或者获取剪贴板的方法pasteboardWithName:create:。可以通过这个方法获取名字为UIPasteboardNameFind的剪贴板,这个剪贴板一般用来搜索,输入到UISearchBar的内容会自动被复制到这个剪贴板。
以上两个系统的剪贴板都是可以允许所有app访问的。

通过上面提到的方法创建一个自己命名的剪贴板,这样的剪贴板名字自己知道,所以一般是app私用的。

剪贴板的持久化

系统的剪贴板默认是持久化的。app通过把persistent属性置为YES,也可以把app创建的剪贴板持久化。
持久化说的是,app重启和手机重启都不会清除这个剪贴板,以及剪贴板的内容。

剪贴板的owner和item

owner就是最后一个往剪贴板添加内容的对象。item就是添加到剪贴板的每条内容。剪贴板可以有好多内容,并且进行了分类,可以有文字、图片、url等等。app可以从剪切板读取想要数量的内容,也可以限定只读取某种类型的内容,比如只读文字,不读图片等等。

item的展示形式
item上面说是添加到剪贴板的每条内容。为了能够支持富文本等带有效果的内容的复制,需要记录内容的展示形式,有时候对于同一个item,可以有多种展示形式。内容的展示形式用Unique Type Identifier (UTI)来区分,在读取间剪贴板内容的时候,剪贴板需要根据UTI来决定如何返回内容。如果app定义了自有的展示形式,也要给它定义一个UTI,且保证UTI的唯一性。
下图展示同一个item可以有不同的展示形式:
剪贴板UIPasteboard
一个内容有不同的展示形式的好处在于,对于同一个剪贴板中的同一个内容,app可以根据自身的能力(功能)只提取它关心的(能够处理的)展现形式。比如一个剪贴板复制了一串富文本,然后一个可以处理富文本的app读取这个剪贴板的时候可以指定获取item的富文本的形式,而一个只能处理普通文本的app读取到这个item之后可以使用plain-text的形式。

changeCount

剪贴板的一个属性,剪贴板每变更一次,这个属性值加1,变更包括item的添加、移除。剪贴板每变更一次还会发一个通知。

复制到剪贴板

可以直接添加到剪贴板的类型有 NSString, NSArray, NSDictionary, NSDate, NSNumber, or NSURL
将这些类型的对象写入剪贴板用 setValue:forPasteboardType:方法

其他类型都要先转为NSData
将NSData对象写入剪贴板用 setData:forPasteboardType:方法

给写入item的数据创建尽可能多的展示形式,并为每种展示形式分配好UTI。
然后将每种展示形式通过上面的setValue:forPasteboardType:方法和 setData:forPasteboardType:方法写入剪贴板。

可以选择的UTI有
UIKIT_EXTERN NSArray

从剪贴板中获取内容

先用方法containsPasteboardTypes:检查一下是否有目标类型的内容。
然后调用以下方法获取内容
valueForPasteboardType:
dataForPasteboardType:
(本文参考apple文档,图来自apple文档:)