今天的主题是怎样读/写粘帖板。

 

粘帖板概述

 

多粘帖板

 

iPhone上不只一个粘帖板:

有两个系统粘帖板:一个通用系统粘帖板用于复制/粘贴操作,一个查找粘帖板保存上一次搜寻用的字符串。

另外,应用程序还可以创建自己的粘帖板,甚至可以被其他应用程序使用。例如,零售机程序以及信用卡终端程序可以使用共享粘帖板来传递支付信息。

 

多重表示

 

加入到粘帖板的条目都有一个类型。更准确地说,当一个条目加入到粘帖板时,都有一个或多个类型的表示。比如,一个网页地址可以存储为字符串或一个URL。

 

在粘帖板中存储多种表示的好处是带来了条目使用的灵活性。一个email客户端程序可以使用文本表示将URL的NSString注入到邮件主体中;而播客(podcast)可以通过NSURL表示获取播客内容。

 

这种处理方法并非iPhone独有。这种设计可以使Safari中的复制操作在TextMate中产生普通文本而在页面中产生格式化好的文本。

 

粘帖板操作

 

注意:虽然本文中的范例使用通用粘帖板,但因为所有粘帖板都是UIPasteboard的子类,编程方法适用于所有粘帖板。

 

使用通用粘帖板

 

generalPasteboard类方法返回一个通用粘帖板的指针,例如:

1
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];

 

常用属性

 

最常用的粘帖板操作包括获取/设置字符串,图像,URL和颜色。Apple提供了以下方便的方法:

1
2
3
4
5
NSString *string = pasteboard.string;  
UIImage *image = pasteboard.image;  
NSURL *url = pasteboard.URL;  
UIColor *color = pasteboard.color;    
pasteboard.string = @"paste me somewhere";

 

确定一种类型的表示是否存在

 

如果某种类型的条目不存在,那么getter方法将返回nil。这是一个很方便的方法可以预先知道特定类型的表示是否存在。使用containsPasteboardTypes: 方法检查:

1
2
if ([pasteboard containsPasteboardTypes: [NSArray arrayWithObject:@"public.utf8-plain-text"]])     
    NSLog(@"String representation present: %@", pasteboard.string);

 

使用pasteboardTypes可获取一个条目的各种类型。

 

统一类型标志符 — UTI

 

上例中通过检查public.utf8-plain-text类型来确定字符串是否存在。本例将使用UTI(通用类型标志符)。有关UTI信息,请见Apple的 通用类型标志符概述文档。

 

Apple在UTCoreTypes.h中提供了通用类型的常量。要使用这些常量:

  1. 在项目中加入MobileCoreServices framework
  2. #import <MobileCoreServices/MobileCoreServices.h>

 

常量的类型是CFStringRef。你可以把它们当作NSString。CFStringRef是一种C和Objective-C通用的表达方式。为在Objective-C使用它,只需简单的转换操作:

1
NSString *urlUTIType = (NSString *)kUTTypeURL;

 

你可以自由构造自己的数据类型;为保证独特性,Apple推荐使用reverse-DNS标记式样(如com.mobileorchard.mySnazzyType)。

 

设置/提取缺乏Getter/Setter的类型

 

Getter/Setter只是为了提供方便。实际上,它们与使用valueForPasteboardType: 和 setValue:forPasteboardType 方法没什么区别:

1
2
NSString *string = [pasteboard valueForPasteboardType:@"public.utf8-plain-text"];  
[pasteBoard setValue:@"paste me somewhere" forPasteboardType:@"public.utf8-plain-text"];

 

此方法适用于字符串,数组,字典,日期,数值和URL。而dataForPasteboardType 和 setData:forPasteboardType: 方法适用于其它各种类型。

 

以多种表示存储条目

 

使用方便的setter有一个很大的限制:条目只能以一种类型存储。而如果使用上述方法,我们可以将URL存为NSString和NSURL,以构成一个类型和值的字典并设置其条目属性:

1
2
3
4
5
static NSString *string = @"http://www.mobileorchard.com";  
NSDictionary *item = [NSDictionary dictionaryWithObjectsAndKeys: string,
    @"public.utf8-plain-text", [NSURL URLWithString:string],   
    (NSString *)kUTTypeURL,     nil];  
pasteboard.items = [NSArray arrayWithObject:item];

 

现在,pasteboard.string和pasteboard.url都将有内容返回了。

 

粘帖板支持多条目

 

请注意,在上例中,我们使用了items — 复数形式 — 属性。为保持本教程的简单性,我将粘帖板视为一个单条目实体。如果你需要,你可以获取/设置粘帖板的条目数组。这实际上很简单,请参见文档。

 

原文见:New In iPhone 3.0 Tutorial Series, Part 3: Copy & Paste With UIPasteboard 作者:Dan Grigsby