原文地址:https://github.com/nixzhu/dev-blog/blob/master/2014-04-22-ui-activity-viewcontroller.md
数据与代码的关系一直都让人好奇。
特定的编程语言,如 Lisp、lo 和 Mathematica 都是同像性的(homoiconic),意味着它们的代码可作为数据原语呈现,也就是说它们自身就可在代码中被操纵。许多其他语言,包括 Objective-C ,就不同了,在两者之间建立了严格的界限,回避 eval()
和其它潜在的危险的动态指示加载方法。
当问题中的数据过大或难以表示为除了字节流之外的任何东西时,那么代码与数据的这种紧张关系就达到了一个新的高度。关于“如何编码、解码以及解释图像、文档和媒体的二进制表示”的问题从最开始的操作系统开始就一直存在着。
OS X 的 Core Services 框架
与 iOS 的移动 Core Services 框架
都提供函数通过通用类型标识符(Universal Type Identifiers,即UTI)来根据文件扩展和MIME类型识别和分类数据类型。UTI提供了可扩展和可继承的分类系统,它能给予开发人员极大的灵活性,即使是处理最奇特的文件类型。例如,一个 Ruby 源代码文件(.rb)被分类为 Ruby 源代码 > 源代码 > 文本 > 内容 > 数据;一个 QuickTime 电影文件(.mov)被分类为视频 > 电影 > 试听内容 > 内容 > 数据;
在桌面文件系统抽象里,UTI工作得相当好。然而,在一个移动范式里,文件和目录对于用户来说都被隐藏了,于是这很快就失效了。而且,更重要的是,云服务和社交媒体的兴起已经让远程实体比本地文件具有更重要的地位。因此,UTI和URL之间出现了紧张关系。
很明显我们需要其它的某种东西。那 UIActivityViewController 能成为我们拼命追求的解决办法吗?
UIActivityViewController ,出现于 iOS 6,在应用里为分享和操作数据提供了一个统一的服务接口。
给出一个可操作数据的集合,那一个 UIActivityViewController 实例就可如下创建:
NSString *string = ...;
NSURL *URL = ...;
UIActivityViewController *activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:@[string, URL]
applicationActivities:nil];
[navigationController presentViewController:activityViewController
animated:YES
completion:^{
// ...
}];
这将在屏幕的底部呈现如下所示的东西:
默认情况下,UIActivityViewController 将显示所有可用于所提供内容的服务,但我们也可以排除特定的 Activity 类型。
activityViewController.excludedActivityTypes = @[UIActivityTypePostToFacebook];
Activity 类型又分为“操作”和“分享”两大类:
UIActivityCategoryAction
- UIActivityTypePrint
- UIActivityTypeCopyToPasteboard
- UIActivityTypeAssignToContact
- UIActivityTypeSaveToCameraRoll
- UIActivityTypeAddToReadingList
- UIActivityTypeAirDrop
UIActivityCategoryShare
- UIActivityTypeMessage
- UIActivityTypeMail
- UIActivityTypePostToFacebook
- UIActivityTypePostToTwitter
- UIActivityTypePostToFlickr
- UIActivityTypePostToVimeo
- UIActivityTypePostToTencentWeibo
- UIActivityTypePostToWeibo
每个 Activity 类型都支持好多种不同的数据类型。例如,一条 Tweet 可能由 NSString 以及一个附加的图像 和/或 URL 所组成。
不同的 Activity 类型所支持的数据类型
Activity 类型 | 字符串 | 属性字符串 | URL | Data | 图像 | Asset | 其它 |
---|---|---|---|---|---|---|---|
发布到 Facebook | ✓ | ✓ | ✓ | ✓ | |||
发布到 Twitter | ✓ | ✓ | ✓ | ✓ | |||
发布到 Weibo | ✓ | ✓ | ✓ | ✓ | ✓ | ||
信息 | ✓ | ✓ | ✓* | ✓* | ✓* | sms:// NSURL | |
邮件 | ✓+ | ✓+ | ✓+ | ||||
打印 | ✓+ | ✓+ | UIPrintPageRenderer, UIPrintFormatter, & UIPrintInfo | ||||
拷贝到剪贴板 | ✓ | ✓ | ✓ | UIColor, NSDictionary | |||
添加到联系人 | ✓ | ||||||
保存到相机胶卷 | ✓ | ✓ | |||||
添加到阅读列表 | ✓ | ||||||
发布到 Flickr | ✓ | ✓ | ✓ | ✓ | |||
发布到 Vimeo | ✓ | ✓ | ✓ | ||||
发布到腾讯微博 | ✓ | ✓ | ✓ | ✓ | ✓ | ||
AirDrop | ✓ | ✓ | ✓ | ✓ | ✓ |