2012-10-23 12 views
17

Ich benutze iOS 6 neue Möglichkeit, Informationen zu teilen: UIActivityViewController. Um die gemeinsam genutzten Daten auswählen, die auf den Medien abhängig (Facebook, Twitter oder E-Mail) mein View-Controller die UIActivityItemSource Protokoll wie folgt implementieren:UIActivityItemSource Protocole Set komplexes Objekt

- (IBAction)onShareButton:(UIButton *)sender 
{ 

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

    activityViewController.excludedActivityTypes = @[UIActivityTypeMessage, UIActivityTypeAssignToContact, UIActivityTypeCopyToPasteboard, UIActivityTypeMessage, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeSaveToCameraRoll]; 
    [self presentViewController:activityViewController animated:YES completion:^{}]; 
} 

#pragma mark - UIActivityItemSource Protocol 

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { 
    if ([activityType isEqualToString:UIActivityTypePostToFacebook]) { 
     NSArray *items = @[@"message facebook", [NSURL URLWithString:@"http://www.myUrlFacebook.com"]]; 
     return items; 
    } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) { 
     NSArray *items = @[@"message twitter", [NSURL  URLWithString:@"http://www.myUrlTwitter.com"]]; 
     return items; 
    } else if ([activityType isEqualToString:UIActivityTypeMail]) { 
     NSArray *items = @[@"message mail", [NSURL URLWithString:@"http://www.myUrlMail.com"]]; 
     return items; 
    } 

     NSArray *items = @[@"Not a proper Activity", [NSURL URLWithString:@"http://www.myUrlMail.com"]]; 
    return items; 
} 

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

Wenn ich eine einfache NSString für activityViewController:itemForActivityType: der String Rückkehr ist gut, die von meiner UIActivityViewController, aber ich kann keinen Weg finden, eine Array zu verwenden!

Laut Apple Dokumentation sollte es möglich sein:

Diese Methode gibt die tatsächlichen Objektdaten durch ein Aktivitätsobjekt zu beaufschlagbar Apple documentation

Hat jemand jemals dieses UIActivityItemSource Protokoll verwenden, um mit Arrays, oder gibt es ein Tutorial, um das zu tun?

Hinweis: Ich habe diesen Fehler auch auf der Konsole, kann es helfen ...

Launch Services: Die Registrierung unbekannt App Kennung com.apple.mobilemail

Launch Services fehlgeschlagen: nicht gefunden App Kennung com.apple.mobilemail

+2

Haben Sie herausgefunden, was diese Nachricht über com.apple.mobilemail in der Konsole ist? –

+1

Der Konsolenfehler tritt nur im Simulator auf, wo die Mail-App einfach nicht existiert. Es kann ignoriert werden. – Emil

+0

@Tommecpe: Wie hast du es behoben? – BaSha

Antwort

16

nach einer erheblichen Menge an Zeit damit verbringen, diese ein, um herauszufinden, wie es scheint es nicht möglich ist, es ein NSArray von Gegenständen zu übergeben. Also habe ich UIActivityViewController erweitert, um es möglich zu machen.

RDActivityViewController

+0

Vielen Dank. Ich werde es testen, sobald ich kann. –

+0

Kann jemand auf das oben genannte eingehen? Welche Methode erlaubt kein NSArray? Ich habe das gleiche Problem und kann die Antwort nicht verstehen. Tnx. – jbbenni

+1

Das ist großartig! Vielen Dank! Ich hatte in dieser Angelegenheit ein paar Stunden lang gegen eine Wand geschlagen. RDActivityViewController funktioniert gut. – Dylan

20

ein einzelnes Objekt kann UIactivityItemSource konforme nur ein einziges Stück von Daten für activityViewControllerPlaceholderItem: zurückzukehren, keine NSArray s.

Sie könnten dies überwinden, indem Sie zwei UIActivityItemSource s im activityItems Teil der ursprünglichen erstellen und übergeben. Jede Quelle kann einen Platzhalterwert übergeben, kann jedoch unter itemForActivityType einen leeren Wert zurückgeben, sodass Sie diesen bestimmten Datentyp je nach Aktivität nicht verwenden müssen.

Oder verwenden Sie einfach diese coole Erweiterung in der anderen Antwort erwähnt.

Verwandte Themen