实现UIActivityItemSource协议

The*_*nus 13 ios ios6

我有这些协议方法,

activityViewControllerPlaceholderItem:activityViewController:itemForActivityType:

但他们永远不会被召唤.我如何告诉UIActivityViewController他们打电话给他们?

我也有一个UIActivityItemProvider子类,但我很困惑谁调用这两个方法.我真的很感激一些示例代码,因为我在网上找不到任何东西.:)

小智 26

你可以在任何你想要的地方实现协议,甚至你的viewcontroller都可以.只需实例化activityViewController即可initWithActivityItems:@[self].

  • 你能否确切地告诉我们为什么需要在"initWithActivityItems"中添加"self"? (2认同)

Sih*_*vic 19

JotWee的答案帮助了我.

不需要子类,UIActivityItemSource可以在实现共享按钮的视图控制器中实现协议方法.

添加self活动项数组非常重要,就像这样(如JotWee建议的那样):

NSArray *activityItems = [NSArray arrayWithObjects:self, url, image, nil];
Run Code Online (Sandbox Code Playgroud)

这是我的最终实施:

ViewController.h

@interface ViewController : UIViewController <UIActivityItemSource>
Run Code Online (Sandbox Code Playgroud)

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";
}
Run Code Online (Sandbox Code Playgroud)


Nie*_*els 16

根据文件.传递给的活动项数组
-initWithActivityItems:applicationActivities:可以是数据对象数组,如字符串或图像,也可以是实现UIActivityItemSource协议的对象数组.

如果传递实现UIActivityItemSource协议的对象数组,那么您的实例UIActivityViewController将在您的活动项上调用这些方法.这些对象不一定必须是子类UIActivityItemProvider.UIActivityItemProvider只是一个符合这个协议的类.

  • 我已经这样做了,但这些方法没有被调用.我传入了一个`UIActivityItemProvider`对象(是的,我在视图控制器中实现了`UIActivityItemSource`协议). (2认同)
  • 你不应该在视图控制器中实现`UIActivityItemSource`协议.`UIActivityItemProvider`实现了该协议的方法. (2认同)