主题为自定义UIActivity

时间:2014-09-11 07:15:54

标签: ios objective-c uiactivityviewcontroller

如何指定自定义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设置应该被使用的方式。

2 个答案:

答案 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];
}