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。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值