在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