本文参考了关东升的博客http://2009315319.blog.51cto.com/701759/1195374
UIActivityViewController是iOS 6后,苹果用来替换actionsheet的新的控制器。功能有点类似以前的URL scheme。
在iOS上它以模态出现,而在iPad上则是popover。
苹果已经内置很多UIActivity。社交:天朝有微信微博,外国有推特Facebook。邮件,相机等。
使用也很简单。
一是为现有的UIActivity提供数据。让它们接收你传的数据,并显示相应的UI。这些数据可以是真实的字符串,图片以及URL,也可以是某些对象。作为数据提供者的对象,是有格式要求的,这个要求写在了UIActivityItemSource协议中。你只要实现这些协议方法,就能作为UIActivity的数据提供者了。苹果已经内置了一个实现这些方法的类UIActivityProvider。你可以使用它来简化一些操作。这边引用了一段代码:
- (IBAction)shareAction:(id)sender {
NSString *textToShare = @”请大家登录《iOS云端与网络通讯》服务网站。”; ①
UIImage *imageToShare = [UIImage imageNamed:@"iosshare.jpg"]; ②
NSURL *urlToShare = [NSURL URLWithString:@"http://www.iosbook3.com"]; ③
NSArray *activityItems = @[textToShare, imageToShare, urlToShare]; ④
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems
applicationActivities:nil]; ⑤
//不出现在活动项目
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll]; ⑥
[self presentViewController:activityVC animated:TRUE completion:nil]; ⑦
}
分别给出了提供的真实数据以及所需的UIActivity。当然这边是采用不包含的方式进行的。
第二种是自定义自己的UIActivity。这边和前边的很类似,不过这边有个自定义的UIActivity。
- (IBAction)shareAction:(id)sender {
NSURL *urlToShare = [NSURL URLWithString:@"http://iosshare.cn/"]; ①
NSArray *activityItems = @[urlToShare];
BookActivity *bookActivity = [BookActivity new]; ②
NSArray *applicationActivities = @[bookActivity];
UIActivityViewController *activityVC = [[UIActivityViewController alloc]
initWithActivityItems:activityItems
applicationActivities:applicationActivities]; ③
[self presentViewController:activityVC animated:YES completion:nil];
}
既然是自定义的,那么也需要能够处理你传入的数据。UIActivity是一个抽象类,你要使用它的子类,因此你需要继承它,而继承它的同时你又覆盖它的一些方法,来提供对处理这些数据的支持。
打开UIActivity文档,你会发现一些有意思的东西。一个UIActivity的分类包括UIActivityCategoryAction和UIActivityCategoryShare两种。而它的类型一般就是我们的UIActivity名。还需要提供标题和图片。另外的一些方法,看起来有点代理时候的意思。
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
指明了我们的应用能否对数据源数组作出回应。似乎有点麻烦,整个数组既可以是一组不同类型数据组成的一项,也可以是满足数据提供者的一个数据。如果是真实数据,我们只需要看看数组中有没有我们要处理的数据类型。如果是提供者,我们也得检查下它是否提供了我们关心的数据。
- (void)prepareWithActivityItems:(NSArray *)activityItems
这是在回应点击消息前的一些准备,譬如你要处理下数据,再做反应。这时候可以把关键的数据存起来。
- (void)performActivity
这时候就真的进行回应了。
还有什么没讲到?
想在你的程序回应之后做点事?
那就覆盖- (void)activityDidFinish:(BOOL)completed;使用completed来判断是否完成回应。
想在UIActivityViewController消失的时候做点啥?
那就用下这个属性 completionHandler。
差不多了吧。或者你也可以去看看汤普森的著名博客http://nshipster.com/uiactivityviewcontroller/