復制、剪切、和粘貼操作(一) <- iOS文本編程指南

用戶可以在一個app中復制文本、圖片、或者其他數(shù)據,并粘貼該數(shù)據到該app的其他位置,或不同的app中。例如,你可以在email信息中復制一個人的地址,并把它粘貼到“聯(lián)系人”app的合適字段中。UIKit框架在UITextView和UITextField類中實現(xiàn)了復制-剪切-粘貼。如果你想在自己的app中使用該功能,你可以使用這些類的對象,也可以實現(xiàn)自己復制-剪切-粘貼。

接下來的部分將描述使用復制、剪切、和粘貼操作的UIKit編程接口,并解釋它們是如何做到的。

注意:對于復制和粘貼操作相關的指南,參見iOS Human Interface Guidelines中的“Supporting Copy and Paste”。

UIKit中的復制-粘貼操作

UIKit框架中的多個類和一個非正式協(xié)議,給了你在app中實現(xiàn)復制、剪切、和粘貼所需方法和機制:

  • UIPasteboard類提供剪貼板:在app中或app之間共享數(shù)據的保護區(qū)域。該類提供方法,可以從剪貼板讀取數(shù)據的項目,也可以向粘貼半寫入數(shù)據的項目。
  • UIMenuController類在選中部分的上面或者下面顯示一個編輯按鈕,用以復制、剪切、或者粘貼。默認的編輯菜單命令是(可能是)復制、剪切、粘貼、選擇、及選擇全部。你還可以添加自定義菜單項目到編輯菜單(參見Adding Custom Items to the Edit Menu)。
  • UIResponder類聲明了canPerformAction:withSender:方法。Responder類可以實現(xiàn)該方法來顯示和移除基于當前內容的編輯菜單的命令。
  • UIResponderStandardEditActions非正式協(xié)議聲明了處理復制、剪切、粘貼、選擇、以及選擇全部命令的接口。當用戶點擊在編輯菜單中點擊其中一個命令時,對應的UIResponderStandardEditActions方法會被調用。

剪貼板概念

剪貼板是在app內或app間交換數(shù)據的標準化機制。剪貼板最常用于處理復制、剪切、以及粘貼操作:

  • 當用戶選擇app中的數(shù)據并選擇復制(或剪切)命令時,該被選中的數(shù)據會被放置到剪貼板上。
  • 當用戶選擇粘貼命令時(可以在相同或者不同的app中),剪貼板上的數(shù)據被復制到當前的app中。

在iOS中,剪貼板也用于支持查找操作。此外,您可以使用剪貼板在應用程序之間使用自定義URL方案傳輸數(shù)據,而不是復制,剪切和粘貼命令;有關此技術的信息,參見Updating Your Info.plist Settings。

無論操作如何,使用剪貼板對象的基本任務就是向其寫入數(shù)據以及從其中讀取數(shù)據。盡管這些任務概念上很簡單,但是它們掩蓋了一些重要的細節(jié)。主要的復雜性是可以有多中方法表示數(shù)據,而這種復雜性帶來了效率問題。這些以及其他問題在下面部分討論。

命名剪貼板

剪貼板可以是公共的也可以是私有的。公共的剪貼板被稱為系統(tǒng)剪貼板;私有的剪貼板是由app創(chuàng)建的,于是被稱為app剪貼板。剪貼板必須有唯一的名字。UIPasteboard定義了兩個系統(tǒng)剪貼板,它們都有自己的名字和目的:

  • UIPasteboardNameGeneral用于涉及廣泛數(shù)據類型的剪切、復制、以及粘貼操作。你可以通過涉及的generalPasteboard類方法來獲取表示通用剪貼板的單例對象。
  • UIPasteboardNameFind是用于查找操作。當前用戶在搜索欄中輸入的字符串是寫入到剪貼板,因此可以在不同app中共享。你可以通過調用pasteboardWithName:create:方法來獲取到表示剪貼板的對象,傳入UIPasteboardNameFind作為名字。

通常你使用一種系統(tǒng)定義的剪貼板,但是如有必要,你可以使用pasteboardWithName:create: 來創(chuàng)建你自己app的剪貼板。如果你嗲用了pasteboardWithUniqueName,UIPasteboard給你一個唯一名字的app剪貼板。你可以通過name屬性發(fā)現(xiàn)剪貼板的名字。

剪貼板持久化

剪貼板可以被持久化。當剪貼板是持久化的時候,它可以在系統(tǒng)重啟之后繼續(xù)存在與之前的app中。系統(tǒng)剪貼板是持久化的。盡管app的剪貼板默認是不持久化的,但是app可以通過把持久化屬性設置為YES來標記它的持久化功能。App剪貼板不會持久化,知道創(chuàng)建它或擁有它的app退出。持久化的app剪貼板在該app卸載的時候被移除。

剪貼板的所有者和項目

最后將數(shù)據放入剪貼板的對象被稱為剪貼板的所有者。被放入剪貼板的數(shù)據的每個部分被稱為剪貼板的項目。剪貼板可以有一個或者多個項目。App可以根據需要替換或者檢索多個項目。例如,用戶在一個包含文本和圖片的視圖中進行選擇。剪貼板讓你把復制的文本和圖片分別作為項目。從剪貼板讀取多個項目的app,可以選擇只使用它支持的項目(例如,只有文本,而沒有圖片)。

重要:當app把數(shù)據寫入剪貼板的時候,即使只有單個項目,該數(shù)據也會替換剪貼板中原油的內容。即使你使用UIPasteboard的addItems:方法來添加項目,類的寫入方法也不會在剪貼板的當前內容后增加項目。

表示法和UTI

剪貼板操作經常被用到不同的app之間。應用之間無需知道彼此,包括它能處理的數(shù)據種類。為了最大化發(fā)揮共享的作用,一個剪貼板可以持有同一個剪貼板項目的多個表示法。例如,一個富文本編輯器或許提供了復制數(shù)據的HTML、PDF、以及純文本表示法。剪貼板的一個項目包括了所有app可以提供的數(shù)據項目的表示法。

每個剪貼板項目的表示法通常通過唯一類型標識符(Unique Type Identifier,UTI)標識。(UTI是簡單的字符串,它是一個特定數(shù)據類型的唯一標記。)UTI提供標記數(shù)據類型的通用方法。如果你有想要支持的自定義的數(shù)據類型,你必須為它創(chuàng)建唯一的標識符。為此,你可以使用反向DNS(reverse-DNS)符號表示類型字符串來確保唯一性;例如,一個自定義百澳是類型可以是com.myCompany.myApp.myType。更多UTI的信息,參見Uniform Type Identifiers Overview。

例如,假設一個app支持富文本和圖片的選擇。它或許想把富文本和所選文本的Unicode版本,以及所選圖片的不同表示法放置到剪貼板。每個項目的每個表示法都存儲有它們自己的數(shù)據,如圖5-1所示。

圖 5-1 剪貼板項目和表示法

通常情況下,為了最大化發(fā)揮共享的作用,剪貼板項目應該包含盡可能多的不同的表示法。

剪貼板讀取器必須找到最合適它功能的數(shù)據類型(如果有的話)。通常,這意味著選擇最豐富的可用類型。例如,一個文本編輯器或許提供了復制的數(shù)據的HTML(富文本)和純文本表示法。支持副文本的app應該檢索HTML表示法,而支持純文本的app應該檢索純文本版本。

改變計數(shù)

改變計數(shù)是每個剪貼板都有的變量,每次剪貼板特定改變內容(當項目增加、修改、或者移動時)時它都會增加。通過檢查改變計數(shù)(通過changeCount屬性),app可以確定剪貼板中的當前數(shù)據和它最后接受的數(shù)據是否相同。每次改變計數(shù)都會增加,剪貼板會發(fā)送一個通知給感興趣的觀察者。

第一步:識別選擇并顯示編輯菜單

如果你打算復制、剪切、或粘貼什么的話,你首先必須選中它。(粘貼操作通常在一個空的位置操作,例如插入符,指示項目集合中的位置。)在選中了項目并可視化的指示了所選后,你應該顯示編輯菜單。編輯菜單是系統(tǒng)菜單,它可能有如下命令:復制、剪切、粘貼、選擇、和選擇全部。編輯菜單在選中的位置。當用戶點擊菜單項時,響應的
UIResponderStandardEditActions方法實現(xiàn)(例如 cut:或 paster:)會被調用。

更多關于選擇和如何顯示和管理編輯菜單的內容,參見 Managing the Selection and the Edit Menu。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容