《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";
}
相关文章
|
23天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
18 1
|
2月前
|
搜索推荐 Android开发 iOS开发
探析安卓与iOS系统的优劣
【2月更文挑战第7天】安卓与iOS是当今手机市场上最主流的两款操作系统,各有优劣。本文将从用户体验、开放程度、生态系统等方面对两者进行深入探析,以期帮助读者更好地了解它们的特点。
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
33 4
|
1月前
|
机器学习/深度学习 测试技术 API
iOS系统下轻松构建自动化数据收集流程
iOS系统下轻松构建自动化数据收集流程
24 0
|
1月前
|
搜索推荐 安全 Android开发
安卓与iOS系统的用户体验比较
【2月更文挑战第11天】 在当今移动设备市场上,安卓和iOS系统一直是两大主流操作系统。本文将从用户界面设计、应用生态、系统定制性等方面对安卓和iOS系统进行比较分析,旨在探讨两者的优势和劣势,为用户选择合适的操作系统提供参考。
|
2月前
|
人工智能 vr&ar Android开发
探索安卓与iOS系统的发展趋势
【2月更文挑战第9天】 过去,人们对于安卓和iOS系统的争论主要集中在性能、用户体验和生态系统的比较上。然而,随着移动互联网的快速发展,两大操作系统在人工智能、物联网、安全性等方面的发展趋势也备受关注。本文将探讨安卓与iOS系统在技术发展方面的差异以及未来的发展趋势。
|
2月前
|
搜索推荐 Android开发 iOS开发
探讨安卓与iOS系统的用户体验差异
【2月更文挑战第7天】 在当今移动互联网时代,安卓和iOS系统是最受欢迎的手机操作系统。本文将从用户界面设计、应用生态系统、定制性能等方面探讨安卓与iOS系统的用户体验差异,为读者提供更深入的了解。
|
2月前
|
安全 开发工具 Android开发
安卓与iOS系统的优缺点比较
【2月更文挑战第6天】 安卓和iOS是目前市场上最流行的两种操作系统。虽然它们都拥有自己的独特之处,但它们也有一些共同之处。本文将探讨这两种操作系统的优缺点,并对它们进行比较。
|
2月前
|
搜索推荐 安全 Android开发
探索安卓与iOS系统的差异与共通之道
【2月更文挑战第4天】安卓与iOS作为当前主流的移动操作系统,各自拥有独特的特性和功能。本文将深入探讨安卓和iOS系统的差异,并提出一些共通之道,帮助读者更好地了解和应用这两个系统。
|
2月前
|
人工智能 vr&ar Android开发
探索安卓与iOS系统的技术进展
【2月更文挑战第4天】本文将探讨安卓与iOS两大操作系统在最新技术进展方面的差异与相似之处。我们将分析它们在人工智能、增强现实、隐私保护等方面的创新和发展,并展望未来可能出现的趋势。通过对比这两个操作系统的技术特点,读者将能够更好地了解并选择适合自己需求的智能设备。