2012-10-04 13 views
12

ich diese Protokoll Methoden haben,Umsetzung des UIActivityItemSource Protokoll

activityViewControllerPlaceholderItem: und activityViewController:itemForActivityType:

aber sie nie aufgerufen. Wie kann ich dem UIActivityViewController sagen, sie anzurufen?

Ich habe auch eine UIActivityItemProvider Unterklasse, aber ich bin verwirrt, wer diese 2 Methoden ruft. Ich würde wirklich einen Beispielcode schätzen, da ich im Internet nichts finden kann. :)

Antwort

14

Laut der Dokumentation. Das Array der Aktivitätselemente, die Sie an
-initWithActivityItems:applicationActivities: übergeben, kann ein Array von Datenobjekten wie Zeichenfolgen oder Bildern sein oder ein Array von Objekten, die das UIActivityItemSource-Protokoll implementieren. Wenn Sie ein Array von Objekten übergeben, die das Protokoll UIActivityItemSource implementieren, ruft Ihre Instanz UIActivityViewController diese Methoden für Ihre Aktivitätselemente auf. Diese Objekte müssen nicht notwendigerweise Unterklassen von UIActivityItemProvider sein. UIActivityItemProvider ist nur eine Klasse, die diesem Protokoll entspricht.

+2

Ich mache das schon, und trotzdem werden die Methoden nicht aufgerufen. Ich übergebe ein 'UIActivityItemProvider'-Objekt (und ja, ich habe das' UIActivityItemSource'-Protokoll in meinem View-Controller implementiert). – Mahouk

+2

sollten Sie das 'UIActivityItemSource'-Protokoll nicht in Ihrem View-Controller implementieren. 'UIActivityItemProvider' implementiert die Methoden für dieses Protokoll. – Niels

+0

Es funktioniert jetzt, dass ich die Methoden in meiner Unterklasse 'UIActivityItemProvider' implementiert habe! Danke vielmals! Ich bin seit Stunden dabei. – Mahouk

26

Sie können das Protokoll implementieren, wo auch immer Sie wollen, sogar Ihr Viewcontroller ist in Ordnung. Instantiieren Sie einfach den activityViewController mit .

+2

Können Sie genau erklären, warum wir "self" in "initWithActivityItems" hinzufügen müssen: –

+0

Wenn Sie Ihren ViewController als Ihre UIActivityItemSource festlegen, müssen Sie dem UIActivityViewController mitteilen. – Leon

17

Die Antwort von JotWee hat mir geholfen.

Es ist keine Unterklassierung erforderlich, UIActivityItemSource Protokollmethoden können im View-Controller implementiert werden, wo der Share-Button implementiert ist.

Sehr wichtig self Aktivitäts Artikel Array hinzuzufügen, wie dies (wie JotWee vorgeschlagen):

NSArray *activityItems = [NSArray arrayWithObjects:self, url, image, nil]; 

Hier ist meine endgültige Umsetzung:

ViewController.h

@interface ViewController : UIViewController <UIActivityItemSource> 

Viewcontroller .m

- (void)shareBarButtonItemClick:(UIBarButtonItem *)sender 
{ 
    NSURL *url = [NSURL URLWithString:@"http://example.com"]; 
    NSURL *imageUrl = [NSURL URLWithString:@"http://example.com/images/1.jpg"]; 
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]]; 

    NSArray *activityItems = [NSArray arrayWithObjects:self, url, image, nil]; 

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; 

    [self presentViewController:activityViewController animated:YES completion:nil]; 
} 

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType 
{ 
    return @"Summary Text"; 
} 

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController 
{ 
    return @""; 
} 

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType 
{ 
    return @"Subject"; 
} 
Verwandte Themen