剪貼板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可以有不同的展示形式:
這裏寫圖片描述
一個內容有不同的展示形式的好處在於,對於同一個剪貼板中的同一個內容,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文檔:)