2012-10-04 82 views
12

我有這些協議的方法,實施UIActivityItemSource協議

activityViewControllerPlaceholderItem:activityViewController:itemForActivityType:

,但他們從來沒有被調用。我如何告訴UIActivityViewController給他們打電話?

我也有一個UIActivityItemProvider的子類,但我很困惑誰來調用這兩種方法。我真的很感激一些示例代碼,因爲我在網上找不到任何東西。 :)

回答

14

根據文檔。的活動項傳遞給
-initWithActivityItems:applicationActivities:陣列可以是數據對象的數組,例如字符串或圖像,或者它可以是實現了UIActivityItemSource協議對象數組。

如果您傳遞一個實現UIActivityItemSource協議的對象數組,那麼您的UIActivityViewController實例將在您的活動項目上調用這些方法。這些對象不一定必須是UIActivityItemProvider的子類。 UIActivityItemProvider只是一個符合這個協議的類。

+2

我已經這樣做了,但方法沒有被調用。我傳入一個'UIActivityItemProvider'對象(是的,我在我的視圖控制器中實現了'UIActivityItemSource'協議)。 – Mahouk

+2

你不應該在視圖控制器中實現'UIActivityItemSource'協議。 'UIActivityItemProvider'實現這個協議的方法。 – Niels

+0

現在,我在我的'UIActivityItemProvider'子類中實現了方法!非常感謝!我已經好幾個小時了。 – Mahouk

26

你可以在任何你想要的地方實現協議,甚至你的viewcontroller都可以。只需使用initWithActivityItems:@[self]實例化activityViewController即可。

+2

你真的可以告訴我們爲什麼我們需要在「initWithActivityItems」中添加「self」: –

+0

如果你設置你的ViewController爲你的UIActivityItemSource,那麼你需要告訴UIActivityViewController。 – Leon

17

JotWee的回答幫了我。

沒有必要爲子分級,UIActivityItemSource協議方法可以在視圖控制器,其中份額按鈕實施實現。

非常重要的補充self在活動項目陣列,像這樣(爲JotWee建議):

NSArray *activityItems = [NSArray arrayWithObjects:self, url, image, nil]; 

這是我最終的實現:

ViewController.h

@interface ViewController : UIViewController <UIActivityItemSource> 

的ViewController .m

- (void)shareBarButtonItemClick:(UIBarButtonItem *)sender 
{ 
    NSURL *url = [NSURL URLWithString:@"http://example.com"]; 
    NSURL *imageUrl = [NSURL URLWithString:@"http://example.com/images/1.jpg"]; 
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]]; 

    NSArray *activityItems = [NSArray arrayWithObjects:self, url, image, nil]; 

    UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; 

    [self presentViewController:activityViewController animated:YES completion:nil]; 
} 

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType 
{ 
    return @"Summary Text"; 
} 

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController 
{ 
    return @""; 
} 

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType 
{ 
    return @"Subject"; 
}