《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消息,查询粘贴板的可用类型。这将返回当前存储在粘贴板上的类型的数组:

NSArray *types = [pb pasteboardTypes];

可以在粘贴板上设置数据,并通过传递一个NSData对象和一个描述数据所顺应的类型的UTI,来关联一种类型。此外,对于属性列表对象(即字符串、日期、数组、字典、数字或URL),可以通过setValue:forPasteboardType:设置一个NSValue。这些属性列表对象在内部的存储方式稍微不同于它们的原始数据版本,从而导致了方法上的差异:

[[UIPasteboard generalPasteboard]
setData:theData forPasteboardType:theUTI];

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 创建自动将文本输入到粘贴板中的解决方案

- (void) updatePasteboard
{
    // Copy the text to the pasteboard when the watcher is enabled
    if (enableWatcher)
        [UIPasteboard generalPasteboard].string = textView.text;
}

- (void) textViewDidChange: (UITextView *) textView
{
    // Delegate method calls for an update
    [self updatePasteboard];
}

- (void) toggle: (UIBarButtonItem *) bbi
{
    // switch between standard and auto-copy modes
    enableWatcher = !enableWatcher;
    bbi.title = enableWatcher ? @"Stop Watching" : @"Watch";
}
上一篇:java加密工具类,可设置对应的加解密key


下一篇:解构赋值