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