2012-11-21 9 views
6

W końcu znajduję kogoś, kto borykał się z tym samym problemem niż ja.Podklasa i używanie UIActivityItemProvider z UIActivityViewController

UIActivityViewController customize text based on selected activity

Chcę dostosować share z działalnością UIActivityViewController. Dobrą odpowiedź jest następująca:

„Zamiast przechodzącą ciągi tekstowe do initWithActivityItems połączenia, przechodzą w swoim własnym podklasy klasy UIActivityItemProvider i kiedy wdrożyć metodę itemForActivityType zapewni się usługa współużytkowania jako parametr "activityType"

Możesz następnie zwrócić niestandardową treść z tej metody. "

Rozumiem sztuczek, ale nie dostaję sposób to zrobić ...

Zrobiłem to jako podklasy:

@interface SharingItems : UIActivityItemProvider 

@implementation SharingItems 

-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType 
{ 
    // Here depending on the activityType i want to share NSString or UIImage 
} 

@end 

Ale ja nie wiem co zrobić teraz w mojej oryginalnej viewController:

-(void)actionSheet 
{  
    if ([[UIActivityViewController class] respondsToSelector:@selector(alloc)]) 
    { 
     __block NSString *imgName = [[NSString alloc] initWithFormat:@"%@", _sharingUrl]; 
     NSArray *activityItems = [NSArray arrayWithObjects:imgName, nil]; 

     UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; 
     [self presentViewController:activityController animated:YES completion:nil]; 

     __block NSString *chan  = [[NSString alloc] initWithFormat:@"%@", _channel]; 
     [activityController setCompletionHandler:^(NSString* activityType, BOOL completed) 
     { 
      if (completed) 
      { 
      } 
     }]; 
    } 
    else 
     [self displayActionSheet]; 
} 

Odpowiedz

15

Oto przykład UIActivityItemProvider (nie testowane, ale zaadaptowany z kodem roboczy):

@implementation StringProvider 

- (id)initWithPlaceholderString:(NSString*)placeholder facebookString:(NSString*)facebookString 
{ 
    self = [super initWithPlaceholderItem:placeholder]; 
    if (self) { 
     _facebookString = facebookString; 
    } 
    return self; 
} 

- (id)item 
{ 
    if ([self.activityType isEqualToString:UIActivityTypePostToFacebook]) { 
     return _facebookString; 
    } else { 
     return self.placeholderItem; 
    } 
} 

@end 

Następnie podczas konfigurowania kontrolera widok działalność:

StringProvider *stringProvider = [[StringProvider alloc] initWithPlaceholderString:@"Default string" facebookString:@"Hello, Facebook."]; 
UIActivityViewController *shareController = [[UIActivityViewController alloc] initWithActivityItems:@[stringProvider] applicationActivities:nil]; 

Zasadniczo tworzenia UIActivityItemProviders które zapewniają właściwą dane, gdy - (id) Metoda pozycja nazywa się i przechodzą w tych dostawców poz aktywność kiedy tworzysz kontroler widoku aktywności. Musisz zainicjować element zastępczy, aby system operacyjny wiedział, jaka klasa będzie ostateczna (najprawdopodobniej NSString, NSURL, UIImage). Mam nadzieję, że pomaga!

+0

W jaki sposób można zwrócić wiele obrazów/wideo za pomocą tej metody "przedmiotu"? – Suran

Powiązane problemy