2012-10-23 14 views
17

Używam iOS 6 nowy sposób udostępniania informacji: UIActivityViewController. Aby wybrać udostępnione dane w zależności od mediów (Facebook, Twitter lub mail) mój widok kontroler wdrożyć UIActivityItemSource protokół następująco:UIActivityItemSource Protocole zestaw złożonych obiektów

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

Kiedy wracam prosty NSString dla activityViewController:itemForActivityType: łańcuch jest dobrze wykorzystane przez moich UIActivityViewController, ale nie mogę znaleźć sposobu na użycie Array!

Według Apple dokumentacji powinno być możliwe:

Ta metoda zwraca rzeczywisty obiekt danych należy działał przez przedmiot działalności Apple documentation

Czy ktoś kiedykolwiek użyć tej UIActivityItemSource Protokół z Arrays, czy też jest do tego pełny samouczek?

Uwaga: Ja też mam ten błąd na konsoli, może pomóc ...

uruchamiania Usługi: Rejestrowanie nieznanego identyfikatora aplikacji com.apple.mobilemail udało

uruchomienia usługi: nie można znaleźć identyfikator aplikacji com.apple.mobilemail

+2

Czy dowiedziałeś się, co ten komunikat o com.apple.mobilemail znajduje się w konsoli? –

+1

Błąd konsoli występuje tylko w symulatorze, w którym aplikacja pocztowa po prostu nie istnieje. Można go zignorować. – Emil

+0

@Tommecpe: Jak to naprawiłeś? – BaSha

Odpowiedz

16

Po spędzeniu dużej ilości czasu na wymyśleniu tego, wydaje się, że nie można go przekazać NSArray przedmiotów. Rozszerzyłem więc UIActivityViewController, aby było to możliwe.

RDActivityViewController

+0

Dziękuję bardzo. Testuję to tak szybko, jak tylko mogę. –

+0

Czy ktoś może rozwinąć powyższe? Jaka metoda nie pozwala na NSArray? Mam ten sam problem i nie mogę zrozumieć odpowiedzi. Tnx. – jbbenni

+1

To jest świetne! Dziękuję Ci! Waliłem głową o ścianę przez kilka godzin nad tym problemem. RDActivityViewController działa świetnie. – Dylan

20

pojedynczy obiekt zgodny UIactivityItemSource może zwrócić tylko jeden element danych do activityViewControllerPlaceholderItem:, nie NSArray s.

Można tego uniknąć, tworząc i przekazując dwa numery UIActivityItemSource w części activityItems początkowej initWithActivityItems:. Każde źródło może przekazać wartość zastępczą, ale może zwrócić coś pustego na itemForActivityType, więc nie musisz używać tego konkretnego typu danych w zależności od aktywności.

Lub po prostu użyj tego fajnego rozszerzenia wymienionego w drugiej odpowiedzi.

Powiązane problemy