UIActivityItemProvider使⽤
关于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 @"";
}
view ui框架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,结果⼤部分分享平台都识别不了⽽隐藏了)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论