2012-09-28 26 views
32

Tôi muốn tùy chỉnh văn bản cho cùng một thông tin nhưng khi tôi đang chia sẻ nó trên Facebook Tôi không muốn sử dụng thẻ băm twitter hoặc lược đồ @username ...UIActivityViewController tùy chỉnh văn bản dựa trên hoạt động đã chọn

Cách thế nào tôi có thể đa dạng hóa văn bản để chia sẻ dựa trên dịch vụ chia sẻ nào sẽ được sử dụng?

Ofcourse Tôi đang sử dụng UIActivityViewController:

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

Trả lời

27

Thay vì đi qua các chuỗi văn bản vào initWithActivityItems cuộc gọi, vượt qua trong riêng sub-class của bạn của lớp UIActivityItemProvider và khi bạn thực hiện phương pháp itemForActivityType nó sẽ cung cấp dịch vụ chia sẻ dưới dạng tham số 'activityType'.

Sau đó, bạn có thể trả về nội dung tùy chỉnh từ phương pháp này.

+0

Cảm ơn bạn rất nhiều vì câu trả lời này :) – Ertai

+9

Một số mã ví dụ sẽ là tuyệt vời để xác thịt câu trả lời này ra –

+1

Great câu trả lời, cảm ơn. Thêm một ví dụ nhanh chóng dưới đây. – pkorosec

39

Tôi lấy câu trả lời này và tạo một lớp đơn giản cho nó. Thông báo mặc định sẽ được nhìn thấy bằng cách chia sẻ các cửa hàng khác với Twitter, và đối với các từ Twitter trong mảng hashWords sẽ xuất hiện với băm nếu chúng xuất hiện trong thông báo mặc định. Tôi nghĩ rằng tôi sẽ chia sẻ nó cho bất cứ ai khác, những người cần nó. Cảm ơn Christopher!

Cách sử dụng:

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]; 

Tiêu đề:

@interface TwitterHashActivityItemProvider : UIActivityItemProvider 

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

@property (nonatomic,strong) NSArray *hashItems; 

@end 

Thực hiện:

#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

Nên 'self.activityType == UIActivityTypePostToTwitter' là' [self.activityType isEqualToString: UIActivityTypePostToTwitter] 'hoặc một cách an toàn có thể sử dụng con trỏ không? –

1

Swift dụ thực hiện một lớp con UIActivityItemProvider. Tùy chọn sao chép sẽ chỉ sử dụng mật khẩu, các loại hoạt động khác sẽ sử dụng văn bản chia sẻ đầy đủ. Nên dễ dàng tùy chỉnh cho các trường hợp sử dụng khác nhau. Tín dụng cho Cristopher & NickNack cho câu trả lời của họ.

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 
      } 
     } 
    } 
} 

Cách sử dụng:

let itemProvider = PasswordShareItemsProvider(password: password) 
let activityViewController = UIActivityViewController(activityItems: [itemProvider], applicationActivities: nil) 
Các vấn đề liên quan