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

用戶可以在一個(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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灌灾,一起剝皮案震驚了整個(gè)濱河市搓译,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锋喜,老刑警劉巖些己,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豌鸡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡段标,警方通過查閱死者的電腦和手機(jī)涯冠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逼庞,“玉大人蛇更,你說我怎么就攤上這事∪悖” “怎么了派任?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)璧南。 經(jīng)常有香客問我掌逛,道長(zhǎng),這世上最難降的妖魔是什么司倚? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任颤诀,我火速辦了婚禮,結(jié)果婚禮上对湃,老公的妹妹穿的比我還像新娘崖叫。我一直安慰自己,他們只是感情好拍柒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布心傀。 她就那樣靜靜地躺著,像睡著了一般拆讯。 火紅的嫁衣襯著肌膚如雪脂男。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天种呐,我揣著相機(jī)與錄音宰翅,去河邊找鬼。 笑死爽室,一個(gè)胖子當(dāng)著我的面吹牛汁讼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播阔墩,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘿架,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了啸箫?” 一聲冷哼從身側(cè)響起耸彪,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忘苛,沒想到半個(gè)月后蝉娜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唱较,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年召川,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绊汹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扮宠,死狀恐怖西乖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坛增,我是刑警寧澤获雕,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站收捣,受9級(jí)特大地震影響届案,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜罢艾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一楣颠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咐蚯,春花似錦童漩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至期奔,卻和暖如春侧馅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背呐萌。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工馁痴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肺孤。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓罗晕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親渠旁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子攀例,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 復(fù)制和剪切選中內(nèi)容 當(dāng)用戶點(diǎn)擊編輯菜單的復(fù)制或者剪切命令杂靶,系統(tǒng)調(diào)用響應(yīng)對(duì)象的copy:或者cut:方法梆惯。通常第一響...
    raingu24閱讀 1,247評(píng)論 0 0
  • 內(nèi)容來自于 iOS文檔中 About Text Handling in iOS 部分 ios平臺(tái)提供了顯示及編輯文...
    縱橫而樂閱讀 6,765評(píng)論 2 21
  • 復(fù)制,剪切吗垮,粘貼操作 用戶可以復(fù)制某個(gè)應(yīng)用中的文本垛吗,圖片,或者其他數(shù)據(jù)到另外一個(gè)地方烁登,到該應(yīng)用內(nèi)或者另一個(gè)應(yīng)用都可...
    卓小土閱讀 389評(píng)論 0 2
  • 編輯菜單是一種上下文菜單怯屉,它用來顯示可執(zhí)行的命令,例如文本視圖或圖片中的文字饵沧。編輯菜單是復(fù)制锨络、剪切、以及粘貼操作的...
    raingu24閱讀 801評(píng)論 0 0
  • 男人聚在一起狼牺,要么聊球羡儿,要么聊車,當(dāng)然喝了酒還會(huì)聊妹子是钥。 笑笑計(jì)劃環(huán)駕中國(guó)掠归,眾籌一輛奔馳G500。 我是蠻羨慕的悄泥,...
    負(fù)債如何辦閱讀 642評(píng)論 2 2