子类和UIActivityItemProvider与UIActivityViewController一起使用

Ast*_*ker 7 xcode objective-c sharing ios

我终于找到了一个比我面临同样问题的人.

UIActivityViewController根据所选活动自定义文本

我想使用UIActivityViewController的活动自定义内容共享.好的答案如下:

"不是将文本字符串传递给initWithActivityItems调用,而是传入您自己的UIActivityItemProvider类子类,当您实现itemForActivityType方法时,它将提供共享服务作为'activityType'参数.

然后,您可以从此方法返回自定义内容."

我理解技巧,但我没有办法做到这一点......

我这样做是一个子类:

@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
Run Code Online (Sandbox Code Playgroud)

但我不知道在我原来的viewController中现在要做什么:

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

小智 15

这是一个示例UIActivityItemProvider(未经过测试但改编自工作代码):

@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
Run Code Online (Sandbox Code Playgroud)

然后,当您设置活动视图控制器时:

StringProvider *stringProvider = [[StringProvider alloc] initWithPlaceholderString:@"Default string" facebookString:@"Hello, Facebook."];
UIActivityViewController *shareController = [[UIActivityViewController alloc] initWithActivityItems:@[stringProvider] applicationActivities:nil];
Run Code Online (Sandbox Code Playgroud)

基本上,您创建UIActivityItemProviders,在调用 - (id)item方法时提供正确的数据,并在创建活动视图控制器时传入这些活动项提供程序.您需要使用占位符项初始化,以便操作系统知道最终项目将是哪个类(很可能是NSString,NSURL,UIImage).希望有所帮助!