IOS/Objective-C:UIActivityViewController:针对不同的Activity类型进行自定义

Posted

技术标签:

【中文标题】IOS/Objective-C:UIActivityViewController:针对不同的Activity类型进行自定义【英文标题】:IOS/Objective-C: UIActivityViewController: Customize for different Activity Types 【发布时间】:2018-02-26 21:24:20 【问题描述】:

我正在尝试自定义使用 UIActivityViewController 共享的内容。一些博客文章和answers on SO 中建议的方法是子类UIActivityItemProvider,如下所示。一些答案还说该类应该采用协议UIActivityItemSource,但我不清楚该协议与提供者有什么关系。

我的代码在一个视图控制器类中,我已经接受了 .h 文件中的<UIActivityItemSource Protocol>。我还在 .m 文件中放置了以下方法以及消息、占位符、URL 和缩略图的类似方法。但是,它们不会对所有类型、消息、电子邮件、Facebook 等共享的内容产生任何影响。

我错过了什么?

-(NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(UIActivityType)activityType

    if (activityType == UIActivityTypeMessage) 
        return @"My message subject";
     else if (activityType == UIActivityTypeMail) 
        return @"My mail subject";
    
    return @"My subject otherwise";

编辑:

以下代码可以很好地将相同的内容发送到不同的活动。但是上面的方法显然是需要自定义的:

NSArray *activityItems = @[text,url];
        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems: activityItems applicationActivities:nil];
        activityViewController.excludedActivityTypes = @[UIActivityTypePostToWeibo,UIActivityTypePrint,UIActivityTypeCopyToPasteboard,UIActivityTypeSaveToCameraRoll];
    [activityViewController setValue:_dare.shtodo forKey:@"Did you see this?"];

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

提前感谢您对我可能缺少的任何建议,以使其正常工作。

【问题讨论】:

你检查过this吗? 【参考方案1】:

在使用initWithActivityItems:applicationActivities: 创建UIActivityViewController 时,您需要传递实现UIActivityItemSource 的类的一个或多个实例 - 请参阅文档here。视图控制器可能不是一个好的选择,我会改为制作专用对象来做到这一点。最终你的代码可能看起来像:

MySourceClass *mySource = [MySourceClass new];
NSArray *activityItems = @[mySource];
UIActivityViewController *activityViewController =
    [[UIActivityViewController alloc] initWithActivityItems:activityItems
                                      applicationActivities:nil];

【讨论】:

我对新课程感到困惑。这是否意味着我需要使用 CMD n 创建一个全新的类,该类具有订阅协议并具有 subjectForActivityType 和类似方法的 mySource.h 和 mySource.m?否则,我使用的代码与您的代码相似——请参阅上面的编辑。它只是不按活动类型区分。 是的,这就是我推荐的。 我在 VC 中有很多方法可以做一些事情,比如为 URL 创建一个 .ics 文件。我将如何将所有这些传递给目标文件。通过给目标文件属性?如 mySource.url = URL?和 mysource.h 文件中的 URL 属性? [mySourceClass new] 给出错误:使用 initWithPlaceholderItem: 实例化 IDActivityItemProvider 的实例。我已将该方法放入类中,但调用 [mySourceClass initWithPlaceholderItem:@"string"] 未找到类方法错误

以上是关于IOS/Objective-C:UIActivityViewController:针对不同的Activity类型进行自定义的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Objective-C:从 NSManagedObject 构建 NSDictionary

iOS/Objective-C:有啥方法可以查看安排了哪些 localNotifications? [复制]

如何通过NEHotspotHelper获取WiFi列表(IOS,objective-c)

IOS/Objective-C:调用完成块的语法

从 iOS 中的私钥派生的证书(Objective-C)

IOS/Objective-C:无法显示核心数据信息