天天看點

《iOS 6進階開發手冊(第4版)》——2.2節秘訣:通路系統粘貼闆

本節書摘來自異步社群《ios 6進階開發手冊(第4版)》一書中的第2章,第2.2節秘訣:通路系統粘貼闆,作者 【美】erica sadun,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

2.2 秘訣:通路系統粘貼闆

ios 6進階開發手冊(第4版)

粘貼闆(在某些系統上也稱為剪貼闆)提供了一種核心os特性,用于跨應用程式共享資料。使用者可以在一個應用程式中把資料複制到粘貼闆上,切換任務,然後把該資料複制到另一個應用程式中。剪切/複制/粘貼特性類似于在大多數作業系統中的那些特性。當使用者在文本框或視圖之間切換時,也可以在單個應用程式内執行複制和粘貼;開發人員也可以為特定于應用程式的資料建立私人粘貼闆,它們将不會被其他應用程式所使用。

uipasteboard類允許通路共享的裝置粘貼闆及其内容。下面這個代碼段傳回一般的系統粘貼闆,它适合于大多數一般的複制/粘貼應用:

uipasteboard *pb = [uipasteboard generalpasteboard];

除了一般的共享式系統粘貼闆之外,ios還提供了特定于應用程式的粘貼闆,以更好地確定資料隐私,它不會擴充到應用程式之外,并且自定義名稱的粘貼闆可以跨應用程式使用,但是僅限于那些知道并且使用粘貼闆名稱鍵的應用程式。使用pasteboardwithuniquename建立特定于應用程式的粘貼闆,它傳回一個應用程式粘貼闆對象,該對象将在應用程式退出前持續存在。

使用pasteboardwithname:create:建立自定義的粘貼闆,它傳回一個具有指定名稱的粘貼闆。為粘貼闆使用反向dns命名方式(例如,com.sadun.shared-application-pasteboard)。如果粘貼闆還不存在,建立參數将指定系統是否應該建立它。這種類型的粘貼闆可以超越單個應用程式的運作而持續存在;可以在建立後把持久屬性設定為yes。可以使用removepasteboardwithname:銷毀粘貼闆,并釋放被它使用的資源。

2.2.1 存儲資料

粘貼闆一次可以存儲一個或多個條目。每個條目都具有一種關聯的類型,可以使用uti指定存儲的是哪種類型的資料。例如,你可能發現public.text(更确切地講是public.utf8-plain-text)存儲文本資料,public.url用于url位址,public.jpeg則用于圖像資料。除此之外,ios上還使用了許多其他的公共資料類型。存儲類型的資料的字典被稱為item,可以通過粘貼闆的items屬性擷取所有可用項目的數組。

可以确定目前利用簡單的消息存儲的項目的種類。可以給粘貼闆發送pasteboardtypes消息,查詢粘貼闆的可用類型。這将傳回目前存儲在粘貼闆上的類型的數組:

可以在粘貼闆上設定資料,并通過傳遞一個nsdata對象和一個描述資料所順應的類型的uti,來關聯一種類型。此外,對于屬性清單對象(即字元串、日期、數組、字典、數字或url),可以通過setvalue:forpasteboardtype:設定一個nsvalue。這些屬性清單對象在内部的存儲方式稍微不同于它們的原始資料版本,進而導緻了方法上的差異:

2.2.2 存儲公共類型

粘貼闆可以進一步專用于幾種資料類型,它們代表最常用的粘貼闆項目。它們是顔色(不是一個屬性清單“值”對象)、圖像(也不是一個屬性清單“值”對象)、字元串和url。uipasteboard類提供了專用的擷取器和設定器,使得更容易處理這些項目。可以把其中每個項目都視作粘貼闆的屬性,是以可以使用點表示法設定和擷取它們。更重要的是,每個屬性都具有一種複數形式,允許把這些項目作為對象的數組來通路它們。

粘貼闆屬性極大地簡化了在最常用的情況下使用系統粘貼闆。屬性通路器包括如下一些。

string:設定或擷取粘貼闆上的第一個字元串。

strings:設定或擷取粘貼闆上的所有字元串的數組。

image:設定或擷取粘貼闆上的第一幅圖像。

images:設定或擷取粘貼闆上的所有圖像的數組。

url:設定或擷取粘貼闆上的第一個url。

urls:設定或擷取粘貼闆上的所有url的數組。

color:設定或擷取粘貼闆上的第一種顔色。

colors:設定或擷取粘貼闆上的所有顔色的數組。

2.2.3 擷取資料

當使用4個特殊類之一時,隻需使用關聯的屬性從粘貼闆中擷取資料即可,否則,可以使用dataforpasteboardtype:方法取出資料。該方法傳回其類型與作為參數發送的uti比對的第一個項目中的資料。粘貼闆中任何其他的比對項目都将被忽略。

如果需要擷取所有比對的資料,可以取回itemsetwithpasteboardtypes:,然後周遊集合,以擷取每個字典。可以從單個字典鍵中取回每個項目的資料類型,以及從其值中取回資料。

如前所述,uipasteboard提供了兩種方法,用于粘貼到粘貼闆上,這依賴于要粘貼的資訊是一個屬性清單對象還是原始的資料。對于屬性清單對象(包括字元串、日期、數字、字典、數組和url),可以使用setvalueforpasteboardtype:方法;對于一般的資料,則使用setdata:for- pasteboardtype:方法。

當粘貼闆改變時,它們将發出一個uipasteboardchangednotification,可以通過預設的nsnotificationcenter觀察者偵聽它。也可以監視自定義的粘貼闆,并通過uipasteboardremoved- notification偵聽它們的删除操作。

注意:

如果你想成功地把文本資料粘貼到notes或mail中,可以在把資訊存儲到粘貼闆上時使用public.utf8-plain-text作為所選的uti。使用string或strings屬性可以自動增強這個uti。

2.2.4 被動更新粘貼闆

坦率地講,ios的選擇和複制界面并不是作業系統的最高效的元素。有時,你希望為使用者簡化操作,同時又準備好打算與其他應用程式共享的内容。

考慮秘訣2-2。它允許使用者使用文本視圖輸入和編輯文本,同時自動執行更新粘貼闆的過程。當觀察者處于活動狀态時(通過簡單地點按按鈕來切換),每一次編輯都會使文本更新粘貼闆。這是通過實作一個文本視圖委托方法(textviewdidchange:)來完成的,該方法通過自動把更改賦予粘貼闆來響應編輯(updatepasteboard)。

這個秘訣示範了通路和更新粘貼闆中涉及的相對簡單性。

秘訣2-2 建立自動将文本輸入到粘貼闆中的解決方案