【问题标题】:Subclass and using UIActivityItemProvider with UIActivityViewController子类化并将 UIActivityItemProvider 与 UIActivityViewController 一起使用
【发布时间】:2016-12-08 18:14:12
【问题描述】:

我终于找到了和我面临同样问题的人。

UIActivityViewController customize text based on selected activity

我想用 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

但我不知道现在在我原来的 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];
}

【问题讨论】:

    标签: ios objective-c xcode sharing


    【解决方案1】:

    这是一个 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
    

    那么当你设置活动视图控制器时:

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

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

    【讨论】:

    • 如何通过item这个方法返回多张图片/视频?
    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多