2012-11-21 11 views
6

Ich endlich jemanden finden, der das gleiche Problem als ich konfrontiert war.Unterklasse und mit UIActivityItemProvider mit UIActivityViewController

UIActivityViewController customize text based on selected activity

Ich möchte den Inhalt Aktie mit den Aktivitäten der UIActivityViewController anpassen. Die gute Antwort ist folgende:

„Statt die Textzeichenfolgen in die initWithActivityItems Ruf vorbei, passieren in der eigenen Unterklasse der UIActivityItemProvider Klasse und wenn Sie die itemForActivityType Methode implementieren wird es die bieten Sharing Service als 'activityType' Parameter.

Sie können dann den benutzerdefinierten Inhalt von dieser Methode zurückgeben. "

Ich verstehe Tricks, aber ich bin nicht immer so, wie es zu tun ...

Ich tue dies als eine Unterklasse:

@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 

Aber ich weiß nicht, was zu jetzt tut in meinem ursprünglichen 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]; 
} 

Antwort

15

Hier ist ein Beispiel UIActivityItemProvider (nicht getestet, aber vom Arbeits Code angepasst):

@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 

Wenn dann stellen Sie die Aktivität View-Controller-up:

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

Grundsätzlich erstellen Sie UIActivityItemProviders, die die richtigen Daten zur Verfügung stellen, wenn die - (id) Element-Methode aufgerufen wird und in diesen Aktivitätsposten-Anbieter übergeben, wenn Sie erstellen den Aktivitätsansicht-Controller. Sie müssen mit einem Platzhalterelement initialisieren, damit das Betriebssystem weiß, in welcher Klasse sich das letzte Element befindet (höchstwahrscheinlich NSString, NSURL, UIImage). Ich hoffe, das hilft!

+0

Wie geben Sie mehrere Bilder/Videos über diese 'item' Methode zurück? – Suran

Verwandte Themen