首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定制UIActivity的主题

定制UIActivity的主题
EN

Stack Overflow用户
提问于 2014-09-11 07:15:54
回答 2查看 1.5K关注 0票数 4

如何指定自定义UIActivity支持主题?

UIActivityItemSource协议的文档提到,如果希望源代码提供主题,则可以实现可选的activityViewController:subjectForActivityType:选择器:

当发布一个项目时,服务可以提供一个独立的主题字段和数据字段,例如电子邮件消息。如果希望为支持该方法的服务提供主题字段,请实现此方法。

但是,据我所知,在任何地方都没有记录我如何实际指定我的自定义UIActivity支持一个主题。这是怎么做的?

编辑:让我的问题更清楚

假设我有一个自定义活动项源,比如DocumentActivityItemSource,它实现了UIActivityItemSource协议,并且我有一个自定义UIActivity,我们可以称之为SendWithFooMessageActivity

然后启动一个UIActivtyViewController:

代码语言:javascript
复制
NSArray *activityItems = @[[[DocumentActivityItemSource alloc] initWithDocument: document]];
NSArray *applicationActivities = @[[[SendWithFooMessageActivity alloc] init]];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems
                                                                                     applicationActivities:applicationActivities];
[parentViewController presentViewController:activityViewController
                                   animated:YES
                                 completion:nil];

现在,在弹出窗口中,我选择SendWithFooMessageActivity。活动控制器随后将调用DocumentActivityItemSource实例上的DocumentActivityItemSource来获取一个项,然后通过调用该对象prepareWithActivityItems:方法将其转发给SendWithFooMessageActivity

活动项将是图像、字符串或url。在本例中,假设DocumentActivityItemSource返回一个字符串,其中包含一个关于文档的退出消息。然后,SendWithFooMessageActivity可以使用这个文本作为它的foo消息的正文文本。

但是,Foo消息也需要一个主题才能有效。有趣的是,UIActivityItemSource协议还包含可选的activityViewController:subjectForActivityType:,它实际上是文档化的,以提供支持服务的主题。

对于苹果提供的电子邮件活动,这确实发生了-- activityViewController:subjectForActivityType:DocumentActivityItemSource上被调用,结果在电子邮件中被用作主题。

但是,似乎没有一种方法可以指定我的自定义SendWithFooMessageActivity也希望从activityitem中获取主题?文档提到,这种情况发生在“支持主题的服务”--那么我如何指定我的服务实际上支持一个主题。

同样,activityViewController:thumbnailImageForActivityType:suggestedSize:也是如此,它应该为“支持服务”提供一个缩略图。这适用于默认的ShareOnTwitter和ShareOnFacebook活动,但似乎没有一种方法可以获得自定义激活来支持它。这个是可能的吗?

到目前为止,我已经使用了@chriszumberge还提供的以下解决方法,即短路activityViewController并直接使用来自项目源的信息初始化自定义活动:

代码语言:javascript
复制
[SendWithFooMessageActivity alloc] initWithSubject: document.title];

但是,这似乎不是整个UIActivityViewController设置应该使用的方式。

EN

回答 2

Stack Overflow用户

发布于 2014-09-29 13:21:23

我建议:

代码语言:javascript
复制
UIActivityViewController *activityVC = [[UIActivityViewController alloc] 
    initWithActivityItems:@[@"Info you're emailing out."] applicationActivities:nil];
[activityVC setValue:@"Custom Email Subject Here" forKey:@"subject"];

但是,由于您使用的是自定义UIActivity,并且看起来使用的是电子邮件,所以我将假设您使用MFMailComposeViewController发送电子邮件。

在这种情况下,我将在您的自定义UIActivityItemProvider中为主题字符串创建一个属性,并将其设置为您输入自定义UIActivity并将其传递给UIActivityViewController的方法。在提供程序中,您可以创建一个字典,并在

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType

方法。

从这里开始,在您的自定义UIActivity中,您可以将主题存储为- (UIViewController*) activityViewController方法中字典中的属性,并且在该方法中使用下面的代码初始化电子邮件并设置主题。

代码语言:javascript
复制
MFMailComposeViewController *mailCVC = [[MFMailComposeViewController alloc] init];
mailCVC.mailComposeDelegate = self;
[mailCVC setSubject:theSubject];
[mailCVC setMessageBody:theMessage isHTML:NO];
[mailCVC addAttachmentData:theData mimeType:@"text/csv" fileName:theFileName];

编辑

UIActivityItemProvder协议定义了UIActivityViewController对象用于检索要操作的数据项的方法(直接来自苹果文档)。activityViewController:subjectForActivityType:方法是UIActivityItemSource协议的一部分。

默认情况下,您的自定义UIActivityItemProvider符合UIActivityItemSource协议。这就是您需要实现subjectForActivityType:方法的地方。

然后,可以使用switch/case语句或一组if语句来确定自定义UIActivity的activityTitle方法中定义的传入[activityType isEqualToString:@"Custom UIActivity Title"]。如果是,那么返回主题字符串应该是什么。但是这需要在您的自定义UIActivityItemProvider子类中。

票数 1
EN

Stack Overflow用户

发布于 2014-09-27 10:44:45

我不认为有一种自动化的方法。

相反,您只需手动调用源项上的协议方法来获取主题。您可以在activityViewController代码或-(void)performActivity方法上这样做。

为了安全起见,您可以先检查它是否已实现:

代码语言:javascript
复制
NSString *subject = nil;
if ([item respondsToSelector:@selector(activityViewController:subjectForActivityType:)]
{
     subject = [item activityViewController:activityViewController subjectForActivityType:activityType];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25781354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档