iOS粘貼板的使用

粘貼板的概念

粘貼板是同一應用程序內或不同應用程序間交換數據的標準化機制。粘貼板最常見的的用途是處理拷貝、剪貼、和粘貼操作:


當用戶在一個應用程序中選定數據並選擇拷貝(或剪切)菜單命令時,被選擇的數據就會被放置在粘貼板上。


當用戶選擇粘貼命令時(可以在同一或不同應用程序中),粘貼板上的數據就會被拷貝到當前應用程序上。


在iPhone OS中,粘貼板也用於支持查找(Find)操作。此外,還可以用於在不同應用程序間通過定製的URL類型傳輸數據(而不是通過拷貝、剪切、和粘貼命令,關於這個技巧的信息請參見“和其它應用程序間的通訊”部分。

無論是哪種操作,您通過粘貼板執行的基本任務是讀寫粘貼板數據。雖然這些任務在概念上很簡單,但是它們屏蔽了很多重要的細節。複雜的原因主要在於數據的表現方式可能有很多種,而這個複雜性又引入了效率的考慮。本文的下面部分將對這些以及其它的問題進行討論。


命名粘貼板

粘貼板可能是公共的,也可能是私有的。公共粘貼板被稱爲系統粘貼板;私有粘貼板則由應用程序自行創建,因此被稱爲應用程序粘貼板。粘貼板必須有唯一的名字。
UIPasteboard
定義了兩個系統粘貼板,每個都有自己的名字和用途:



UIPasteboardNameGeneral
用於剪切、拷貝、和粘貼操作,涉及到廣泛的數據類型。您可以通過該類的
generalPasteboard
類方法來取得代表通用(General)粘貼板的單件對象。



UIPasteboardNameFind
用於檢索操作。當前用戶在檢索條(
UISearchBar
)鍵入的字符串會被寫入到這個粘貼板中,因此可以在不同的應用程序中共享。您可以通過調用
pasteboardWithName:create:
類方法,並在名字參數中傳入
UIPasteboardNameFind
值來取得代表檢索粘貼板的對象。


典型情況下,您只需使用系統定義的粘貼板就夠了。但在必要時,您也可以通過
pasteboardWithName:create:
方法來創建自己的應用程序粘貼板。如果您調用
pasteboardWithUniqueName
方法,
UIPasteboard
會爲您提供一個具有唯一名稱的應用程序粘貼板。您可以通過其
name
屬性聲明來取得這個名稱。


粘貼板的持久保留

您可以將粘貼板標識爲持久保留,使其內容在當前使用的應用程序終止後繼續存在。不持久保留的粘貼板在其創建應用程序退出後就會被移除。系統粘貼板是持久保留的,而應用程序粘貼板在缺省情況下是不持久保留的。將其應用程序粘貼板的
persistent
屬性設置爲
YES
可以使其持久保留。當持久粘貼板的擁有者程序被用戶卸載時,其自身也會被移除。


粘貼板的擁有者和數據項

最後將數據放到粘貼板的對象被稱爲該粘貼板的擁有者。放到粘貼板上的每一片數據都稱爲一個粘貼板數據項。粘貼板可以保有一個或多個數據項。應用程序可以放入或取得期望數量的數據項。舉例來說,假定用戶在視圖中選擇的內容包含一些文本和一個圖像,粘貼板允許您將文本和圖像作爲不同的數據項進行拷貝。從粘貼板讀取多個數據項的應用程序可以選擇只讀取被支持的數據項(比如只是文本,而不支持圖像)。


重要提示:當一個應用程序將數據寫入粘貼板時,即使只是單一的數據項,該數據也會取代粘貼板的當前內容。雖然您可能使用
UIPasteboard

addItems:
方法來添加項目,但是該寫入方法並不會將那些項目加入到粘貼板當前內容之後。

 



數據的表示和UTI

粘貼板操作經常在不同的應用程序間執行。系統並不要求應用程序瞭解對方的信息,包括對方可以處理的數據種類。爲了最大化潛在的數據分享能力,粘貼板可以保留同一個數據項的多種表示。例如,一個富文本編輯器可以提供被拷貝數據的HTML、PDF、和純文本表示。粘貼板上的一個數據項包括應用程序可爲該數據提供的所有表示。

粘貼板數據項的每種表示通常都有一個唯一類型標識符(Unique Type Identifier,縮寫爲UTI)。UTI簡單定義爲一個唯一標識特定數據類型的字符串。UTI提供了一個標識數據類型的常用手段。如果您希望支持一個定製的數據類型,就必須爲其創建一個唯一的標識符。爲此,您可以用反向DNS表示法來定義類型標識字符串,以確保其唯一性。例如,您可以用
com.myCompany.myApp.myType
來表示一個定製的類型標識。更多有關UTI的信息請參見統一類型標識符概述

作爲例子,假定一個應用程序支持富文本和圖像的選擇,它可能希望將富文本和Unicode版本的選定文本,以及選定圖像的不同表示放到粘貼板上。在這樣的場景下,每個數據項的每種表示都和它自己的數據一起保存,如圖3-3所示。


圖3-3  粘貼板及其表示

Pasteboard items and representations

一般情況下,爲了最大化潛在的共享可能性,粘貼板數據項應該包括儘可能多的表示。

粘貼板的讀取程序必須找到最適合自身能力(如果有的話)的數據類型。通常情況下,這意味着選擇內涵最豐富的可用類型。舉例來說,一個文本編輯器可能爲被拷貝的數據提供HTML(富文本)和純文本表示,支持富文本的應用程序應該選擇HTML表示,而只支持純文本的應用程序則應該選擇純文本的表示。


變化記數

變化記數是每個粘貼板都有的變量,它隨着每次粘貼板內容的變化而遞增—特別是發生增加、修改、或移除數據項的時候。應用程序可以通過考察變化記數(通過
changeCount
屬性)來確定粘貼板的當前數據是否和最後一次取得的數據相同。每次變化記數遞增時,粘貼板都會向對此感興趣的觀察者發送通告。

這裏要展示的是,在應用內複製的東西,在其他應用中也可以使用(即粘貼)。
iOS中複製需要用到UIPasteboard,直接來看一下實現的代碼:
[[UIPasteboard generalPasteboard] setPersistent:YES];
[[UIPasteboard generalPasteboard] setValue:aString forPasteboardType:[UIPasteboardTypeListString objectAtIndex:0]];

首先要設置粘貼板爲persistent,因爲程序內的粘貼板默認只在該應用內有效,即無persistent屬性,系統的粘貼板就具有persistent屬性。 UIPasteboardTypeListString 是隻當前保存的類型是String。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章