2012-10-23 10 views
17

Sto usando iOS 6 nuovo modo di condividere informazioni: UIActivityViewController. Per selezionare i dati condivisi a seconda dei media (Facebook, Twitter o e-mail) il mio controller della vista implementare il protocollo UIActivityItemSource come segue:UIActivityItemSource Protocole set complex object

- (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"; 
} 

Quando sto tornando un semplice NSString per activityViewController:itemForActivityType: la stringa è ben utilizzato dal mio UIActivityViewController, ma non riesco a trovare un modo per utilizzare un Array!

Secondo Apple documentazione dovrebbe essere possibile:

Questo metodo restituisce l'oggetto dati effettivi per essere agito da un oggetto un'attività Apple documentation

Qualcuno mai utilizzare questo UIActivityItemSource protocollo con Array, o c'è un tutorial completo per farlo?

Nota: Ho anche ottenuto questo errore sulla console, può essere utile ...

Launch Services: Registrazione sconosciuto identificatore app com.apple.mobilemail fallito

Launch Services: Impossibile trovare App identificatore com.apple.mobilemail

+2

Hai scoperto qual è il messaggio su com.apple.mobilemail nella console? –

+1

L'errore della console si verifica solo nel simulatore, dove l'app di posta semplicemente non esiste. Può essere ignorato. – Emil

+0

@Tommecpe: come lo hai risolto? – BaSha

risposta

16

Dopo aver trascorso una notevole quantità di tempo a cercare di capirci qualcosa, a quanto pare non è possibile passare un NSArray di elementi. Così ho esteso UIActivityViewController per renderlo possibile.

RDActivityViewController

+0

Grazie mille. Lo metterò alla prova il prima possibile. –

+0

Qualcuno può elaborare su quanto sopra? Quale metodo non consente un NSArray? Sto avendo lo stesso problema e non riesco a capire la risposta. Tnx. – jbbenni

+1

Questo è fantastico! Grazie! Ho battuto la testa contro un muro per alcune ore su questo argomento. RDActivityViewController funziona alla grande. – Dylan

20

Un singolo oggetto conforme al UIactivityItemSource può restituire solo un singolo pezzo di dati per activityViewControllerPlaceholderItem:, non NSArray s.

È possibile superare questo problema creando e passando due UIActivityItemSource s nella parte activityItems dello initWithActivityItems: iniziale. Ogni origine può passare un valore di segnaposto, ma può restituire qualcosa di vuoto su itemForActivityType in modo da non dover effettivamente utilizzare quel particolare tipo di dati a seconda dell'attività.

O semplicemente usare questa estensione interessante menzionata nell'altra risposta.

Problemi correlati