[英]Subject for custom UIActivity
如何指定自定义UIActivity
支持主题?
UIActivityItemSource协议的文档提到您可以实现可选的activityViewController:subjectForActivityType:
selector,如果您希望源代码提供主题:
发布项目时,服务可以提供单独的主题字段和数据字段,例如电子邮件消息。 如果您希望为支持该服务的服务提供主题字段,请实施此方法。
但是,据我所知,在任何地方都没有记录我如何实际指定我的自定义UIActivity支持主题。 这是怎么做到的?
编辑:让我的问题更清晰
假设我有一个自定义活动项源,比如实现UIActivityItemSource
协议的DocumentActivityItemSource
,我有一个自定义UIActivity
,我们可以调用SendWithFooMessageActivity
。
然后我启动了一个UIActivtyViewController:
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
实例上调用activityViewController:itemForActivityType:
以获取一个项,然后通过调用该对象prepareWithActivityItems:
方法将其转发到SendWithFooMessageActivity
。
通常,活动项目将是图像,字符串或URL。 在这种情况下,假设DocumentActivityItemSource
返回一个字符串,其中包含有关文档的现有模糊信息。 然后, SendWithFooMessageActivity
可以将此文本用作其foo-mail消息的正文。
但是,Foo消息还要求主题有效。 有趣的是, UIActivityItemSource
协议还包含可选的activityViewController:subjectForActivityType:
实际上是为了提供支持一个服务的主题。
对于Apple提供的电子邮件活动,这确实发生了 - 在DocumentActivityItemSource
上调用activityViewController:subjectForActivityType:
并且结果在电子邮件中用作主题。
但是,似乎没有办法指定我的自定义SendWithFooMessageActivity
还想从activityitem获取主题? 文档提到这种情况发生在“支持[一个主题]的服务” - 那么我如何指定我的服务实际上支持一个。
此外, activityViewController:thumbnailImageForActivityType:suggestedSize:
,它应该为“支持一个的服务”提供缩略图。 这适用于默认的ShareOnTwitter和ShareOnFacebook活动,但似乎没有办法让自定义活动支持它。 这可能吗?
到目前为止,我已经使用了@chriszumberge在下面提供的解决方法,即将activityViewController短路并使用itemsource所需的信息直接初始化自定义活动:
[SendWithFooMessageActivity alloc] initWithSubject: document.title];
但这似乎并不是整个UIActivityViewController
设置应该被使用的方式。
我建议:
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
方法中,并且在同一方法中使用下面的代码初始化电子邮件并设置主题。
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对象用于检索要处理的数据项的方法(直接来自Apple文档)。 activityViewController:subjectForActivityType:
方法是UIActivityItemSource
协议的一部分。
默认情况下,您的自定义UIActivityItemProvider
符合UIActivityItemSource
协议。 这就是您需要实现subjectForActivityType:
方法的地方。
然后,您可以使用switch/case
语句或一堆if
语句来确定自定义UIActivity的activityTitle
方法中定义的传入[activityType isEqualToString:@"Custom UIActivity Title"]
。 如果是这样,那么返回主题字符串应该是什么。 但这需要在您的自定义UIActivityItemProvider
子类中。
我认为没有一种自动化的方法。
相反,您只需手动调用源项目上的协议方法即可获得主题。 您可以在activityViewController
代码上或-(void)performActivity
方法上执行此操作。
为安全起见,您可以检查它是否先实施:
NSString *subject = nil;
if ([item respondsToSelector:@selector(activityViewController:subjectForActivityType:)]
{
subject = [item activityViewController:activityViewController subjectForActivityType:activityType];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.