1.基本使用

UIActivityViewController主要用于分享内容,创建activityView的方法很简单,调用下面的方法创建:

  1. [[UIActivityViewController alloc] initWithActivityItems: applicationActivities:]

第一个参数为要分享的内容数组,可以为任何类,常见的为NSString和UIImage,第二个为自定义Activity数组,每个Activity对应一个按钮,如果只使用系统默认的传入nil。

要显示这个View,使用modal的方式弹出即可。

2.自定义Activity

在微信中打开一个链接,可以通过右上角的按钮打开一个activityView来选择不同的功能,常用的有分享和复制链接,下面我们模拟这个情景,设计一个Activity,实现通过传入的地址用safari打开网站。

①要自定义Activity,要定义一个继承自UIActivity的类,然后重写获取标题、图片和有关活动允许的方法:

头文件:

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface BrowserActivity : UIActivity
  4.  
  5. @end

m文件:

  1. #import "BrowserActivity.h"
  2.  
  3. @interface BrowserActivity ()
  4.  
  5. @property (nonatomic, strong) NSArray *activityItems;
  6.  
  7. @end
  8.  
  9. @implementation BrowserActivity
  10.  
  11. - (NSString *)activityTitle{
  12.  
  13. return @"Browser";
  14.  
  15. }
  16.  
  17. - (UIImage *)activityImage{
  18.  
  19. return [UIImage imageNamed:@"browser"];
  20.  
  21. }
  22.  
  23. - (NSString *)activityType{ // type用于唯一标识活动,一个比较好的方法是用bundleIdentifier加上类名
  24.  
  25. return [[NSBundle mainBundle].bundleIdentifier stringByAppendingString:NSStringFromClass([self class])];
  26.  
  27. }
  28.  
  29. - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{
  30.  
  31. return YES;
  32.  
  33. }
  34.  
  35. - (void)prepareWithActivityItems:(NSArray *)activityItems{
  36.  
  37. self.activityItems = [activityItems copy];
  38.  
  39. }
  40.  
  41. - (void)performActivity{
  42.  
  43. if (self.activityItems.count < 1) {
  44. return;
  45. }
  46. NSString *url = [self.activityItems firstObject];
  47. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
  48. }

其中title决定了按钮的标题,image决定了按钮的图片,type用于唯一标识activity。

为了安全性,系统会先调用- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems方法来询问是否可以执行,你可以根据items的类型判断是否合法,返回YES才会进一步操作,调用- (void)prepareWithActivityItems:(NSArray *)activityItems来加载数据,注意一般数据最好copy防止外部突然改变,最后系统会调用- (void)performActivity方法,在这个方法里执行Activity内容,我们是通过Safari打开这个URL。

注意:这里假设传入的元素只有一个,并且是NSString,没有判断,存在隐患,实际应用应该在canPerformWithActivityItems:方法中判断是否可执行。

②使用一个textField来编辑url,一个按钮来触发activityView:

  1. #import "ViewController.h"
  2. #import "BrowserActivity.h"
  3.  
  4. @interface ViewController () <UITextFieldDelegate>
  5. @property (weak, nonatomic) IBOutlet UITextField *textField;
  6. @property (strong, nonatomic) UIActivityViewController *avc;
  7.  
  8. @end
  9.  
  10. @implementation ViewController
  11.  
  12. - (void)viewDidLoad {
  13. [super viewDidLoad];
  14. // Do any additional setup after loading the view, typically from a nib.
  15. }
  16.  
  17. - (IBAction)shareClick:(id)sender {
  18.  
  19. [self presentViewController:self.avc animated:YES completion:nil];
  20.  
  21. }
  22.  
  23. - (UIActivityViewController *)avc{
  24.  
  25. if (_avc == nil) {
  26. _avc = [[UIActivityViewController alloc] initWithActivityItems:@[self.textField.text] applicationActivities:@[[BrowserActivity new]]];
  27. }
  28.  
  29. return _avc;
  30.  
  31. }
  32.  
  33. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
  34.  
  35. [self.view endEditing:YES];
  36.  
  37. }

当按下share按钮时,会显示下图的界面:

可以看到第二行已经有了Browser这个Activity,注意系统把图片渲染成了黑色。

当点击了Browser时,即可执行活动,通过Safari打开特定URL。

iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity的更多相关文章

  1. iOS7 CookBook精彩瞬间(二)NSSet、通过Subscript访问类成员等

    1.NSSet的用法 ①NSSet是一种无序集合,基于hash实现,可以在线性时间复杂度内查找某个元素,如果要让元素有序,应当使用NSOrderedSet,要让集合可变,与NSArray类似,使用NS ...

  2. iOS7 CookBook精彩瞬间(一)property、selector细节、__unused

    1.我们常常使用nonatomic,很多人只知道它的效率较高,却不知道其含义,其含义是非线程安全的,也就是说多线程修改时不加锁,可能出现多个线程先后修改而成为脏数据的情况. 2.unsafe_unre ...

  3. 实操一下<python cookbook>第三版1

    这几天没写代码, 练一下代码. 找的书是<python cookbook>第三版的电子书. *这个操作符,运用得好,确实少很多代码,且清晰易懂. p = (4, 5) x, y = p p ...

  4. python cookbook第三版学习笔记 一

    数据结构 假设有M个元素的列表,需要从中分解出N个对象,N<M,这会导致分解的值过多的异常.如下: record=['zhf','zhf@163.com','775-555-1212','847 ...

  5. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

  6. python cookbook第三版学习笔记十三:类和对象(三)描述器

    __get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...

  7. python书籍推荐:Python Cookbook第三版中文

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容 ...

  8. python cookbook第三版学习笔记二十一:利用装饰器强制函数上的类型检查

    在演示实际代码前,先说明我们的目标:能对函数参数类型进行断言,类似下面这样: @typeassert(int, int) ... def add(x, y): ...     return x + y ...

  9. python cookbook第三版学习笔记二十:可自定义属性的装饰器

    在开始本节之前,首先介绍下偏函数partial.首先借助help来看下partial的定义 首先来说下第一行解释的意思: partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数, ...

随机推荐

  1. 【HNOI2002】【矩阵快速幂】公交车路线

    仍然是学弟出的题目的原题@lher 学弟将题目改成了多组数据,n在ll范围内,所以我就只讲提高版的做法. 链接:https://www.luogu.org/problem/show?pid=2233 ...

  2. ●BZOJ 2006 NOI 2010 超级钢琴

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2006 题解: RMQ + 优先队列 (+ 前缀) 记得在一两个月前,一次考试考了这个题目的简 ...

  3. 【USACO15FEB】审查(黄金)Censoring (Gold)

    题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...

  4. 安装ipython,使用scrapy shell来验证xpath选择的结果 | How to install iPython and how does it work with Scrapy Shell

    1. scrapy shell 是scrapy包的一个很好的交互性工具,目前我使用它主要用于验证xpath选择的结果.安装好了scrapy之后,就能够直接在cmd上操作scrapy shell了. 具 ...

  5. Linux学习之CentOS(十四)----磁盘管理之 硬连接与软件连接(转)

    前言 在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录),这种是软链接: 另一种则是透过文件系统的 inode 连结来产生新档 ...

  6. SSM框架原理,作用及使用方法(非原创)

    原帖:地址https://blog.csdn.net/bieleyang/article/details/77862042 如有侵权请联系删除 作用: SSM框架是spring MVC ,spring ...

  7. tomcat7+jdk的keytool生成证书 配置https

    目前只会使用jdk的keytool来生成证书.本文仅介绍这种方法. 1Windows下: 1.1 生成keystore文件及导出证书 打开控制台: 运行: %JAVA_HOME%\bin\keytoo ...

  8. eclipse中创建完整的maven项目

    使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...

  9. Button 使用Command 按钮置灰未更新

    当Button绑定了Command,按钮在窗口弹出.或者其它事件时,会自动置灰. 有时,异步执行时间较长时,界面一些绑定了命令的Button,State不会变化,会一直置灰. 直到再次转移Focus. ...

  10. 关于使用Git的几点小技巧

    告诉git忽略对已经纳入版本管理的文件a的修改,git会一直忽略此文件直到重新告诉git可以再次跟踪此文件: git update-index --assume-unchanged a 告诉git恢复 ...