2013-04-14 1 views
9

새로운 UIActivityViewController를 사용하여 공유하기 위해 모든 UIActionSheets을 바꾸려고했지만 문제가 발생했습니다.UIActivityViewController - 특정 활동에 대해서만 URL을 첨부하십시오.

5 가지 활동, 메시지, 이메일, 복사, 트위터 및 Facebook이 있습니다. 난 단지 보여주고 싶은,

ActivityProvider *aProvider = [[ActivityProvider alloc] init]; 
    aProvider.facebook = facebook; 
    aProvider.twitter = twitter; 
    aProvider.urlScheme = URL; 

    NSArray *Items = @[aProvider, sharedURL]; 

    UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:Items applicationActivities:Nil]; 
    activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll, UIActivityTypePostToWeibo]; 


    [self presentViewController:activityVC animated:TRUE completion:nil]; 

그러나 :

- (id) activityViewController:(UIActivityViewController *)activityViewController 
     itemForActivityType:(NSString *)activityType 
{ 
    if ([activityType isEqualToString:UIActivityTypePostToTwitter]) 
     return twitter; 
    if ([activityType isEqualToString:UIActivityTypePostToFacebook]) 
     return facebook; 
    if ([activityType isEqualToString:UIActivityTypeMessage]) 
     return urlScheme; 
    if ([activityType isEqualToString:UIActivityTypeMail]) 
     return urlScheme; 
    if ([activityType isEqualToString:UIActivityTypeCopyToPasteboard]) 
     return urlScheme; 
    return nil; 
} 

그리고 이것은 내보기 컨트롤러 : 난 이미 그 사용자 정의 UIActivityProvider 서브 클래스에서이를 통해 다른 텍스트를 표시해야하는 방법을 알아 냈어요 Facebook, Twitter 공유 시트의 URL (sharedURL)은 메시지, 이메일 또는 사본이 아닙니다. 이것을 달성하기위한 어떤 방법?

답변

15

각 유형의 활동에 보낼 내용을 선택할 수 있습니다. 나는 사용자 정의 활동 제공자를 생성하고 다음과 같이 호출 :

- (id)initWithText:(NSString *)text urlText:(NSString *)url{ 

    if ((self = [super initWithPlaceholderItem:text])) {  
     self.text = text ?: @""; 
     self.url = url ?: @""; 
    } 
    return self; 
} 

- (id)item { 
    NSString *activityType = self.activityType; 
    if ([self.placeholderItem isKindOfClass:[NSString class]]) {    
     if ([self.activityType isEqualToString:UIActivityTypePostToFacebook] || 
      [self.activityType isEqualToString:UIActivityTypeMail]) { 

      return [NSString stringWithFormat:@"%@\n%@", self.text, self.url]; 

     } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) { 

      return [self findBestStringOfLength:kTwitterMessageLength hashTags:YES]; 

     } else if ([activityType isEqualToString:UIActivityTypeMessage]) { 

      return [self findBestStringOfLength:kSMSMessageLength hashTags:YES]; 

     } else { 
      return self.text; 
     } 
    } 

    return self.placeholderItem; 
} 
:

 NSMutableArray *activityItems = [NSMutableArray array]; 

    CustomActivityItemProvider *activityItemProvider = 
    [[CustomActivityItemProvider alloc] initWithText:text 
                urlText:urlString]; 

    [activityItems addObject:activityItemProvider]; 


    //you can have your own custom activities too: 
    NSArray *applicationActivities = @[[CustomActivity new], 
               [OtherCustomActivity new]]; 
    UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:activityItems 
                    applicationActivities:applicationActivities]; 

사용자 지정 공급자가 UIActivityItemProvider

의 서브 클래스
@interface CustomActivityItemProvider : UIActivityItemProvider 

- (id)initWithText:(NSString *)text urlText:(NSString *)url; 

@end 

이처럼 내 사용자 지정 공급자 클래스 보면 뭔가의 용기입니다

0

자신 만의 UIActivityItemProvider를 구현하고 해당 데이터를 사용하지 않으려는 모든 활동 유형에 대해 nil을 반환 할 수 있어야합니다.