2012-11-21 21 views
6

Cuối cùng tôi tìm thấy một người đang đối mặt với cùng một vấn đề hơn tôi.Phân lớp và sử dụng UIActivityItemProvider với UIActivityViewController

UIActivityViewController customize text based on selected activity

Tôi muốn tùy chỉnh chia sẻ nội dung với các hoạt động của UIActivityViewController. Câu trả lời tốt là như sau:

"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 sự dịch vụ chia sẻ dưới dạng thông số 'activityType'.

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

Tôi hiểu thủ đoạn, nhưng tôi không nhận được cách để làm điều đó ...

Tôi đã làm điều này như một lớp con:

@interface SharingItems : UIActivityItemProvider 

@implementation SharingItems 

-(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType 
{ 
    // Here depending on the activityType i want to share NSString or UIImage 
} 

@end 

Nhưng tôi không biết phải làm gì bây giờ trong viewController ban đầu của tôi:

-(void)actionSheet 
{  
    if ([[UIActivityViewController class] respondsToSelector:@selector(alloc)]) 
    { 
     __block NSString *imgName = [[NSString alloc] initWithFormat:@"%@", _sharingUrl]; 
     NSArray *activityItems = [NSArray arrayWithObjects:imgName, nil]; 

     UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; 
     [self presentViewController:activityController animated:YES completion:nil]; 

     __block NSString *chan  = [[NSString alloc] initWithFormat:@"%@", _channel]; 
     [activityController setCompletionHandler:^(NSString* activityType, BOOL completed) 
     { 
      if (completed) 
      { 
      } 
     }]; 
    } 
    else 
     [self displayActionSheet]; 
} 

Trả lời

15

Dưới đây là một ví dụ UIActivityItemProvider (không kiểm tra nhưng chuyển thể từ mã làm việc):

@implementation StringProvider 

- (id)initWithPlaceholderString:(NSString*)placeholder facebookString:(NSString*)facebookString 
{ 
    self = [super initWithPlaceholderItem:placeholder]; 
    if (self) { 
     _facebookString = facebookString; 
    } 
    return self; 
} 

- (id)item 
{ 
    if ([self.activityType isEqualToString:UIActivityTypePostToFacebook]) { 
     return _facebookString; 
    } else { 
     return self.placeholderItem; 
    } 
} 

@end 

Sau đó, khi bạn thiết lập bộ điều khiển xem hoạt động:

StringProvider *stringProvider = [[StringProvider alloc] initWithPlaceholderString:@"Default string" facebookString:@"Hello, Facebook."]; 
UIActivityViewController *shareController = [[UIActivityViewController alloc] initWithActivityItems:@[stringProvider] applicationActivities:nil]; 

Về cơ bản bạn tạo UIActivityItemProviders cung cấp các dữ liệu ngay khi - (id) phương pháp mục được gọi và vượt qua trong những nhà cung cấp hàng hoạt động khi bạn tạo bộ điều khiển chế độ xem hoạt động. Bạn cần khởi tạo với một phần giữ chỗ để hệ điều hành biết lớp cuối cùng sẽ là gì (nhiều khả năng là NSString, NSURL, UIImage). Hy vọng rằng sẽ giúp!

+0

Làm thế nào để bạn trả lại nhiều hình ảnh/video thông qua phương pháp 'mục' này? – Suran

Các vấn đề liên quan