UIActivityItemProvider使用

来源:互联网 发布:金蝴蝶软件 编辑:程序博客网 时间:2024/05/18 01:44

关于UIActivityItemProvider单独说是没有意义的,因为这个类只用于提供UIActivityViewController的activityItem的数据,能起到在合适的时候提供具体数据的作用

关于UIActivityViewController和UIActivity的使用就不多说了,因为这两个类的使用,介绍文档很多,比较复杂的可能就是需要在开多线程处理数据,这个我也没有过多去研究,因为我只是利用这个框架去实现分享操作而已,不涉及太复杂的东西。


言归正传:先让我们开下UIActivityItemProduct类的头文件



先看UIActivityItemProvider里面的内容


其中init方法不可用

initWithPlaceHoderItem:方法是唯一可用的用于提供初始化的方法,参数placeholderItem主要是用来推断这个provider所提供的解析的UTI标识类型是什么

activityType则是用来判断当前是在哪个UIActivity中使用这个数据

最主要的一个属性是Item,这个item属性在实现其子类的时候要求覆盖,可以为nil,不过如果为nil的时候你会发现传到activity里面的activityItem参数则少了为nil的这几个,如果是按照数组的位置来解析参数则有可能出错

一般覆盖形式如下所示:

-(id)item{

    if (self.activityType ==UIActivityTypeCopyToPasteboard) {

        return @"";

    }

    return self.placeholderItem;//这个地方返回不一定是placeholderItem,根据实际需求返回即可

}


这样就可以实现根据不同的平台返回所需的数据


现在我们来看下这个类另一个值得关注的地方:



它实现了UIActivityItemSource接口
现在看下这个接口的内容


其实这个接口主要是用于方便给提供数据的,也就是说,不一定要是UIActivityItemProvider的子类才能提供数据,只要是实现了这个接口的类都可以。

这就可以解释为什么有人继承了UIActivityItemProvider后也实现了这个接口的方法,还是不能正常工作的原因,事实上从接口的描述就可以看出,在UIActivityItemProvider的子类中是不需要实现接口的头两个方法的,因为这两个方法是被描述为必要方法,既然UIActivityItemProvider已经实现了这个协议,就一定也实现了这两方法,体现出来的就是它包含的placeholderItem和Item这两个属性

所以如果需要其他自定义的话只需实现下面三个可选方法就好了~

还有一点要注意的是,虽然UIActivityItemProvider的Item属性是Id,这也不意味着你可以传一个类似数组之类的结构进去,实际上你这样传,也不会报错,可是系统就不能识别这个结构的标识符了,所以系统提供的操作,以及其他非自定义的分享等不能识别这个结构,也都会不显示的,你可以自己去获得这个数据结构,自己解析来用,这样你自定义的平台还能正常工作,但是如果不想使用系统提供的功能,也就没必要使用UIactivityViewController去实现了吧。

简而言之,使用这个类去提供UIActivityVIewControllerr类的数据需要注意以下几点
1.可以通过实现继承这个类,覆盖其子类的setItem方法,通过判断activityType属性去判断不同类型的操作,以实现不同平台操作数据不同的效果
2.没必要在继承了UIactivityItemProvider 后去实现UIActivitySource的两个必要的方法
3.如果要能让系统分别出所传的数据是什么东西,placeholderItem和item的返回类是只能是URL,String,Image等包含在UTI标识符里的
4.最好默认数据不要太多,可能会导致一部分操作识别不了的情况发生,(例如我传过两个URL,结果大部分分享平台都识别不了而隐藏了)
0 0
原创粉丝点击