繁体   English   中英

主题为自定义UIActivity

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM