用戶可以在一個(gè)app中復(fù)制文本娜饵、圖片、或者其他數(shù)據(jù)官辈,并粘貼該數(shù)據(jù)到該app的其他位置箱舞,或不同的app中。例如拳亿,你可以在email信息中復(fù)制一個(gè)人的地址晴股,并把它粘貼到“聯(lián)系人”app的合適字段中。UIKit框架在UITextView和UITextField類中實(shí)現(xiàn)了復(fù)制-剪切-粘貼肺魁。如果你想在自己的app中使用該功能电湘,你可以使用這些類的對(duì)象,也可以實(shí)現(xiàn)自己復(fù)制-剪切-粘貼鹅经。
接下來的部分將描述使用復(fù)制寂呛、剪切、和粘貼操作的UIKit編程接口瘾晃,并解釋它們是如何做到的贷痪。
注意:對(duì)于復(fù)制和粘貼操作相關(guān)的指南,參見iOS Human Interface Guidelines中的“Supporting Copy and Paste”蹦误。
UIKit中的復(fù)制-粘貼操作
UIKit框架中的多個(gè)類和一個(gè)非正式協(xié)議劫拢,給了你在app中實(shí)現(xiàn)復(fù)制、剪切强胰、和粘貼所需方法和機(jī)制:
- UIPasteboard類提供剪貼板:在app中或app之間共享數(shù)據(jù)的保護(hù)區(qū)域舱沧。該類提供方法,可以從剪貼板讀取數(shù)據(jù)的項(xiàng)目偶洋,也可以向粘貼半寫入數(shù)據(jù)的項(xiàng)目熟吏。
- UIMenuController類在選中部分的上面或者下面顯示一個(gè)編輯按鈕,用以復(fù)制玄窝、剪切分俯、或者粘貼肾筐。默認(rèn)的編輯菜單命令是(可能是)復(fù)制、剪切缸剪、粘貼吗铐、選擇、及選擇全部杏节。你還可以添加自定義菜單項(xiàng)目到編輯菜單(參見Adding Custom Items to the Edit Menu)唬渗。
- UIResponder類聲明了canPerformAction:withSender:方法。Responder類可以實(shí)現(xiàn)該方法來顯示和移除基于當(dāng)前內(nèi)容的編輯菜單的命令奋渔。
- UIResponderStandardEditActions非正式協(xié)議聲明了處理復(fù)制镊逝、剪切、粘貼嫉鲸、選擇撑蒜、以及選擇全部命令的接口。當(dāng)用戶點(diǎn)擊在編輯菜單中點(diǎn)擊其中一個(gè)命令時(shí)玄渗,對(duì)應(yīng)的UIResponderStandardEditActions方法會(huì)被調(diào)用座菠。
剪貼板概念
剪貼板是在app內(nèi)或app間交換數(shù)據(jù)的標(biāo)準(zhǔn)化機(jī)制。剪貼板最常用于處理復(fù)制藤树、剪切浴滴、以及粘貼操作:
- 當(dāng)用戶選擇app中的數(shù)據(jù)并選擇復(fù)制(或剪切)命令時(shí),該被選中的數(shù)據(jù)會(huì)被放置到剪貼板上岁钓。
- 當(dāng)用戶選擇粘貼命令時(shí)(可以在相同或者不同的app中)升略,剪貼板上的數(shù)據(jù)被復(fù)制到當(dāng)前的app中。
在iOS中屡限,剪貼板也用于支持查找操作品嚣。此外,您可以使用剪貼板在應(yīng)用程序之間使用自定義URL方案?jìng)鬏敂?shù)據(jù)钧大,而不是復(fù)制腰根,剪切和粘貼命令;有關(guān)此技術(shù)的信息,參見Updating Your Info.plist Settings拓型。
無論操作如何额嘿,使用剪貼板對(duì)象的基本任務(wù)就是向其寫入數(shù)據(jù)以及從其中讀取數(shù)據(jù)。盡管這些任務(wù)概念上很簡(jiǎn)單劣挫,但是它們掩蓋了一些重要的細(xì)節(jié)册养。主要的復(fù)雜性是可以有多中方法表示數(shù)據(jù),而這種復(fù)雜性帶來了效率問題压固。這些以及其他問題在下面部分討論球拦。
命名剪貼板
剪貼板可以是公共的也可以是私有的。公共的剪貼板被稱為系統(tǒng)剪貼板;私有的剪貼板是由app創(chuàng)建的坎炼,于是被稱為app剪貼板愧膀。剪貼板必須有唯一的名字。UIPasteboard定義了兩個(gè)系統(tǒng)剪貼板谣光,它們都有自己的名字和目的:
- UIPasteboardNameGeneral用于涉及廣泛數(shù)據(jù)類型的剪切檩淋、復(fù)制、以及粘貼操作萄金。你可以通過涉及的generalPasteboard類方法來獲取表示通用剪貼板的單例對(duì)象蟀悦。
- UIPasteboardNameFind是用于查找操作。當(dāng)前用戶在搜索欄中輸入的字符串是寫入到剪貼板氧敢,因此可以在不同app中共享日戈。你可以通過調(diào)用pasteboardWithName:create:方法來獲取到表示剪貼板的對(duì)象,傳入U(xiǎn)IPasteboardNameFind作為名字孙乖。
通常你使用一種系統(tǒng)定義的剪貼板浙炼,但是如有必要,你可以使用pasteboardWithName:create: 來創(chuàng)建你自己app的剪貼板唯袄。如果你嗲用了pasteboardWithUniqueName弯屈,UIPasteboard給你一個(gè)唯一名字的app剪貼板。你可以通過name屬性發(fā)現(xiàn)剪貼板的名字越妈。
剪貼板持久化
剪貼板可以被持久化季俩。當(dāng)剪貼板是持久化的時(shí)候钮糖,它可以在系統(tǒng)重啟之后繼續(xù)存在與之前的app中梅掠。系統(tǒng)剪貼板是持久化的。盡管app的剪貼板默認(rèn)是不持久化的店归,但是app可以通過把持久化屬性設(shè)置為YES來標(biāo)記它的持久化功能阎抒。App剪貼板不會(huì)持久化,知道創(chuàng)建它或擁有它的app退出消痛。持久化的app剪貼板在該app卸載的時(shí)候被移除且叁。
剪貼板的所有者和項(xiàng)目
最后將數(shù)據(jù)放入剪貼板的對(duì)象被稱為剪貼板的所有者。被放入剪貼板的數(shù)據(jù)的每個(gè)部分被稱為剪貼板的項(xiàng)目秩伞。剪貼板可以有一個(gè)或者多個(gè)項(xiàng)目逞带。App可以根據(jù)需要替換或者檢索多個(gè)項(xiàng)目。例如纱新,用戶在一個(gè)包含文本和圖片的視圖中進(jìn)行選擇展氓。剪貼板讓你把復(fù)制的文本和圖片分別作為項(xiàng)目。從剪貼板讀取多個(gè)項(xiàng)目的app脸爱,可以選擇只使用它支持的項(xiàng)目(例如遇汞,只有文本,而沒有圖片)。
重要:當(dāng)app把數(shù)據(jù)寫入剪貼板的時(shí)候空入,即使只有單個(gè)項(xiàng)目络它,該數(shù)據(jù)也會(huì)替換剪貼板中原油的內(nèi)容。即使你使用UIPasteboard的addItems:方法來添加項(xiàng)目歪赢,類的寫入方法也不會(huì)在剪貼板的當(dāng)前內(nèi)容后增加項(xiàng)目化戳。
表示法和UTI
剪貼板操作經(jīng)常被用到不同的app之間。應(yīng)用之間無需知道彼此轨淌,包括它能處理的數(shù)據(jù)種類迂烁。為了最大化發(fā)揮共享的作用,一個(gè)剪貼板可以持有同一個(gè)剪貼板項(xiàng)目的多個(gè)表示法递鹉。例如盟步,一個(gè)富文本編輯器或許提供了復(fù)制數(shù)據(jù)的HTML、PDF躏结、以及純文本表示法却盘。剪貼板的一個(gè)項(xiàng)目包括了所有app可以提供的數(shù)據(jù)項(xiàng)目的表示法。
每個(gè)剪貼板項(xiàng)目的表示法通常通過唯一類型標(biāo)識(shí)符(Unique Type Identifier媳拴,UTI)標(biāo)識(shí)黄橘。(UTI是簡(jiǎn)單的字符串,它是一個(gè)特定數(shù)據(jù)類型的唯一標(biāo)記屈溉。)UTI提供標(biāo)記數(shù)據(jù)類型的通用方法塞关。如果你有想要支持的自定義的數(shù)據(jù)類型,你必須為它創(chuàng)建唯一的標(biāo)識(shí)符子巾。為此帆赢,你可以使用反向DNS(reverse-DNS)符號(hào)表示類型字符串來確保唯一性;例如线梗,一個(gè)自定義百澳是類型可以是com.myCompany.myApp.myType椰于。更多UTI的信息,參見Uniform Type Identifiers Overview仪搔。
例如瘾婿,假設(shè)一個(gè)app支持富文本和圖片的選擇。它或許想把富文本和所選文本的Unicode版本烤咧,以及所選圖片的不同表示法放置到剪貼板偏陪。每個(gè)項(xiàng)目的每個(gè)表示法都存儲(chǔ)有它們自己的數(shù)據(jù),如圖5-1所示煮嫌。
圖 5-1 剪貼板項(xiàng)目和表示法
通常情況下笛谦,為了最大化發(fā)揮共享的作用,剪貼板項(xiàng)目應(yīng)該包含盡可能多的不同的表示法立膛。
剪貼板讀取器必須找到最合適它功能的數(shù)據(jù)類型(如果有的話)揪罕。通常梯码,這意味著選擇最豐富的可用類型。例如好啰,一個(gè)文本編輯器或許提供了復(fù)制的數(shù)據(jù)的HTML(富文本)和純文本表示法轩娶。支持副文本的app應(yīng)該檢索HTML表示法,而支持純文本的app應(yīng)該檢索純文本版本框往。
改變計(jì)數(shù)
改變計(jì)數(shù)是每個(gè)剪貼板都有的變量鳄抒,每次剪貼板特定改變內(nèi)容(當(dāng)項(xiàng)目增加、修改椰弊、或者移動(dòng)時(shí))時(shí)它都會(huì)增加许溅。通過檢查改變計(jì)數(shù)(通過changeCount屬性),app可以確定剪貼板中的當(dāng)前數(shù)據(jù)和它最后接受的數(shù)據(jù)是否相同秉版。每次改變計(jì)數(shù)都會(huì)增加贤重,剪貼板會(huì)發(fā)送一個(gè)通知給感興趣的觀察者。
第一步:識(shí)別選擇并顯示編輯菜單
如果你打算復(fù)制清焕、剪切并蝗、或粘貼什么的話,你首先必須選中它秸妥。(粘貼操作通常在一個(gè)空的位置操作滚停,例如插入符,指示項(xiàng)目集合中的位置粥惧。)在選中了項(xiàng)目并可視化的指示了所選后键畴,你應(yīng)該顯示編輯菜單。編輯菜單是系統(tǒng)菜單突雪,它可能有如下命令:復(fù)制起惕、剪切、粘貼挂签、選擇疤祭、和選擇全部盼产。編輯菜單在選中的位置饵婆。當(dāng)用戶點(diǎn)擊菜單項(xiàng)時(shí),響應(yīng)的
UIResponderStandardEditActions方法實(shí)現(xiàn)(例如 cut:或 paster:)會(huì)被調(diào)用戏售。
更多關(guān)于選擇和如何顯示和管理編輯菜單的內(nèi)容侨核,參見 Managing the Selection and the Edit Menu。