在UIActivityViewController中共享不同types的数据
有一个非常类似的问题,由以下post提出: UIActivityViewController中共享提供程序的不同的数据 。 但是我的问题是不同的。
我知道如何通过使用itemForActivityType
来共享具有不同活动的同一types的不同数据。 例如:
- (id) activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { if ( [activityType isEqualToString:UIActivityTypePostToTwitter] ) return @"This is a #twitter post!"; if ( [activityType isEqualToString:UIActivityTypePostToFacebook] ) return @"This is a facebook post!"; if ( [activityType isEqualToString:UIActivityTypeAirDrop] ) return @"Airdrop message text"; else return nil; }
但是,我的问题是: 如果我有不同的数据分享不同的活动,我该怎么办? 。 例如,如果我想分享:
- Twitter上的一个string;
- 在Facebook上的一个string和和图像的数组;
- 带有Airdrop的图像的实际数据(例如NSData)。
PS:
我也看了下面的协议function:
- (id)activityViewControllerPlaceholderItem:;
但是,我不能使用它,因为我们在这里不知道activityType
的价值。
你需要创build和共享两个或多个符合UIActivityItemSource的对象,其中一个返回string,另一个返回一个Image等。然后,当请求该项目的委托callback被调用时,检查select了哪个活动types(Facebook ,邮件,AirDrop等),并有一个或多个ItemSource的返回零,如果该项目不适用于该活动。 确保任何select的活动至less有一个项目返回非零值。
您可以看一下空投示例代码,以获取如何实现UIActivityItemSource
一些示例
对于仍在寻找Objective-C中的解决scheme的人来说,这是为了共享不同的数据源,返回多个对象,并且与whats'app共享。 在我的情况下,我想所有的itemForActivityType的图片和文字:
首先:创build你的UIActivityItemSource,1为文本,1为图像
MyShareImage.h
@protocol giveMeImageToShare - (UIImage*)imageToShare; @end @interface MyShareImage : NSObject<UIActivityItemSource> @property (weak,nonatomic) id<giveMeImageToShare> delegate; @end
MyShareImage.m
#import "MyShareImage.h" @implementation MyShareImage - (id)activityViewControllerPlaceholderItem:(UIActivityViewController*)activityViewController{ return @""; } - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType{ return [[self delegate] imageToShare]; }
然后,MyShareText.h
@protocol givemetextToShare - (NSString*)textToShare; @end @interface MyShareText : NSObject<UIActivityItemSource> @property (weak,nonatomic) id<givemetextToShare> delegate; @end
MyShareText.m
@implementation MyShareText - (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController{ return @""; } - (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType{ if ([activityType containsString:@"net.whatsapp.WhatsApp.ShareExtension"]) { return nil; } return [[self delegate] textToShare];
}
现在activityController:
- (void)shareAllPossible:(id)sender withThisImage:(UIImage*)immagineShare andThisText:(NSString*)testoShare{ immagine = immagineShare; testo = testoShare; MyShareText *myShareText = [MyShareText new]; myShareText.delegate = self; MyShareImage *myShareImage = [MyShareImage new]; myShareImage.delegate = self; NSAssert(immagineShare, @"The image must be loaded to share."); if (immagineShare) { UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[myShareImage ,myShareText] applicationActivities:nil]; activityController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { if (completed) { //NSLog(@"The Activity: %@ was completed", activityType); } else { //NSLog(@"The Activity: %@ was NOT completed", activityType); } }; [self presentViewController:activityController animated:YES completion:nil]; }
}
希望能帮助到你。 *从https://stackoverflow.com/a/37548529/1907742获取灵感Mchurch