2012-09-28 15 views
32

我想自定義文本相同的信息,但是,當我分享在Facebook上,我不希望使用twitter的哈希標籤或@username方案文本...UIActivityViewController定製基於所選活動

如何我可以根據共享服務的使用情況將文本多樣化以進行共享嗎?

Ofcourse我使用UIActivityViewController:

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:@[shareText, shareURL] applicationActivities:nil]; 

回答

27

不是傳遞文本字符串到initWithActivityItems通話,通過在自己的子類UIActivityItemProvider類的,當你實現itemForActivityType方法將提供共享服務作爲'activityType'參數。

然後,您可以從此方法返回自定義內容。

+0

非常感謝您對這個答案:) – Ertai

+9

一些示例代碼將是巨大的充實這個答案出來 –

+1

偉大的答案,謝謝。下面添加了一個快速示例。 – pkorosec

39

我接受了這個答案,併爲它做了一個簡單的類。默認消息將通過除Twitter之外的其他共享出口來顯示,而對於Twitter語言,如果散列字列表中的Twitter語言出現在默認消息中,則它們將與哈希一起顯示。我想我會分享給任何需要它的人。謝謝克里斯託弗!

用法:

TwitterHashActivityItemProvider *twit = [[TwitterHashActivityItemProvider alloc] initWithDefaultText:@"I really like stackoverflow and code" 
                          hashWords:@[@"stackoverflow", @"code"]]; 
NSArray *items = @[twit]; 
UIActivityViewController *act = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; 

部首:

@interface TwitterHashActivityItemProvider : UIActivityItemProvider 

- (id)initWithDefaultText:(NSString*)text hashWords:(NSArray*)hashItems; 

@property (nonatomic,strong) NSArray *hashItems; 

@end 

實現:一個UIActivityItemProvider子類的

#import "TwitterHashActivityItemProvider.h" 

@implementation TwitterHashActivityItemProvider 

- (id)initWithDefaultText:(NSString*)text hashWords:(NSArray*)hashItems; 
{ 
    self = [super initWithPlaceholderItem:text]; 
    if (self) 
    { 
     self.hashItems = hashItems; 
    } 
    return self; 
} 

- (id)item 
{ 
    if ([self.placeholderItem isKindOfClass:[NSString class]]) 
    { 
     NSString *outputString = [self.placeholderItem copy]; 

     // twitter gets some hash tags! 
     if (self.activityType == UIActivityTypePostToTwitter) 
     { 
      // go through each potential hash item and augment the main string 
      for (NSString *hashItem in self.hashItems) 
      { 
       NSString *hashed = [@"#" stringByAppendingString:hashItem]; 
       outputString = [outputString stringByReplacingOccurrencesOfString:hashItem withString:hashed]; 
      } 
     } 

     return outputString; 
    } 

    // else we didn't actually provide a string...oops...just return the placeholder 
    return self.placeholderItem; 
} 

@end 
+5

'self.activityType == UIActivityTypePostToTwitter'是'[self.activityType isEqualToString:UIActivityTypePostToTwitter]'還是可以安全使用指針? –

1

夫特實現示例。複製選項將只使用密碼,其他活動類型將使用完整的共享文本。對於不同的用例應該很容易定製。感謝Cristopher & NickNack的答案。

class PasswordShareItemsProvider: UIActivityItemProvider { 

    private let password: String 

    private var shareText: String { 
     return "This is my password: " + password 
    } 

    init(password: String) { 
     self.password = password 
     // the type of the placeholder item is used to 
     // display correct activity types by UIActivityControler 
     super.init(placeholderItem: password) 
    } 

    override var item: Any { 
     get { 
      guard let activityType = activityType else { 
       return shareText 
      } 

      // return desired item depending on activityType 

      switch activityType { 
      case .copyToPasteboard: return password 
      default: return shareText 
      } 
     } 
    } 
} 

用法:

let itemProvider = PasswordShareItemsProvider(password: password) 
let activityViewController = UIActivityViewController(activityItems: [itemProvider], applicationActivities: nil) 
相關問題