2014-10-24 3 views
4

Существует очень похожий вопрос, заданный следующим сообщением: Different data for sharing providers in UIActivityViewController. Но мой вопрос другой.Обмен данными с различными типами в 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; 
} 

Однако мой вопрос: , что если у меня есть разные данные, чтобы поделиться с различными видами деятельности, что я должен делать?. Например, что, если я хотел бы поделиться:

  • a string on Twitter;
  • массив строк и изображений на Facebook;
  • фактические данные изображения (например, NSData) с Airdrop.

P.S .:

Я также посмотрел на следующей функции протокола:

- (id)activityViewControllerPlaceholderItem:; 

Однако, я не могу использовать его, потому что мы не знаем значение activityType здесь.

+0

«Однако в этой функции у меня нет доступа к типу activity». Но, с другой стороны, это только местозаполнитель. Документы (в отличие от заголовков, которые вы цитируете) делают совершенно ясным, что вы можете изменять типы, когда вы попадаете в 'itemForActivityType:'. – matt

+0

@matt, Да, вы правы. Я фактически цитирую описание в файле заголовка. Но я не вижу здесь упоминания о том, что мы можем изменить типы. Могу я указать на это для меня? Я не могу это найти. Кроме того, я попытался, если тип возвращаемого значения не совпадает с типом заполнителя, он не будет работать. –

+0

https://developer.apple.com/library/ios/documentation/uikit/reference/UIActivityItemSource_protocol/index.html#//apple_ref/occ/intfm/UIActivityItemSource/activityViewControllerPlaceholderItem: – matt

ответ

3

Вы должны создать и совместно использовать два или более объекта, которые соответствуют UIActivityItemSource, где один возвращает строку, другую - изображение и т. Д. Затем, когда вызывающий вызов делегата, запрашивающий элемент, вы проверяете, какой вид активности был выбран (Facebook, Mail, AirDrop и т. д.) и имеет один или несколько возвращаемого значения ItemSource, если этот элемент не применяется к этому действию. Убедитесь, что для любого выбранного действия по крайней мере один из элементов возвращает значение, отличное от нуля.

Вы посмотрите на airdrop sample code может получить некоторые примеры того, как реализовать UIActivityItemSource

+0

Спасибо человеку. На самом деле это то, что я делаю прямо сейчас. –

1

Для тех, кто все еще ищет решение в 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.м

@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