【问题标题】:Share data with different types in UIActivityViewController在 UIActivityViewController 中与不同类型共享数据
【发布时间】:2014-12-20 11:56:29
【问题描述】:

以下帖子提出了一个非常相似的问题:Different data for sharing providers in UIActivityViewController。但我的问题不同。

我知道如何使用itemForActivityType 将同一类型的不同不同数据共享给不同的活动。例如:

- (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 上的一个字符串;
  • Facebook 上的字符串数组和图像;
  • 使用 Airdrop 的图像的实际数据(例如 NSData)。

附注:

我还看了下面的协议函数:

- (id)activityViewControllerPlaceholderItem:;

但是,我不能使用它,因为我们不知道这里 activityType 的值。

【问题讨论】:

  • "但是,在这个函数中,我没有访问 activityType 的权限。"但另一方面,这只是一个占位符。文档(与您引用的标题相反)清楚地表明您可以在到达 itemForActivityType: 时更改类型。
  • @matt,是的,你是对的。我实际上是在引用头文件中的描述。但我没有看到它提到我们可以更改类型的地方。可以请我指出来吗?我找不到它了。而且,我试过了,如果返回类型与占位符类型不匹配,它就不会起作用。

标签: ios objective-c ios7


【解决方案1】:

您想要创建和共享两个或多个符合UIActivityItemSource 的对象,其中一个返回字符串,另一个返回图像等。然后当调用请求该项目的委托回调时,您检查哪个活动选择了类型(Facebook、Mail、AirDrop 等),并且如果该项目不适用于该活动,则该项目源的一个或多个返回 nil。确保对于任何选定的活动,至少有一个项目返回非零值。

您可以查看airdrop sample code 以获取有关如何实现UIActivityItemSource 的一些示例

【讨论】:

    【解决方案2】:

    对于仍在寻找objective-c 解决方案的任何人,这是为了共享不同的数据源,返回多个对象,并且它适用于whats'app 共享。就我而言,我想要所有 itemForActivityType 的图片和文本:

    首先:创建你的 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 教堂

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多