gpt4 book ai didi

ios - 自定义 UIActivity 的主题

转载 作者:可可西里 更新时间:2023-11-01 06:07:08 27 4
gpt4 key购买 nike

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

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

When posting an item the service may provide for a separate subject field and data field, such as an email message. Implement this method if you wish to provide a subject field for services that support one.

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

编辑:让我的问题更清楚

假设我有一个自定义事件项目源,比如说 DocumentActivityItemSource,它实现了 UIActivityItemSource 协议(protocol),我有一个自定义的 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。然后,事件 Controller 将在 DocumentActivityItemSource 实例上调用 activityViewController:itemForActivityType: 以获取项目,然后通过调用将项目转发到 SendWithFooMessageActivity该对象 prepareWithActivityItems: 方法。

通常,事件项是图像、字符串或 url。在这种情况下,假设 DocumentActivityItemSource 返回一个字符串,其中包含关于文档的现有简介。 SendWithFooMessageActivity 然后可以使用此文本作为其 foo-mail 消息的正文。

但是,Foo 消息还需要一个有效的主题。有趣的是,UIActivityItemSource 协议(protocol)还包含可选的 activityViewController:subjectForActivityType:,它实际上被记录为提供一个支持服务的主题。

对于 Apple 提供的电子邮件事件,这确实会发生 - activityViewController:subjectForActivityType:DocumentActivityItemSource 上调用,结果在电子邮件中用作主题。

然而,似乎没有一种方法可以指定我的自定义 SendWithFooMessageActivity 也想从事件项中获取主题?文档提到这种情况发生在“支持 [a subject] 的服务”——那么我如何指定我的服务确实支持一个。

此外,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 协议(protocol)定义了 UIActivityViewController 对象用来检索要操作的数据项的方法(直接来自苹果文档)。activityViewController:subjectForActivityType: 方法是 UIActivityItemSource 协议(protocol)的一部分。

您的自定义 UIActivityItemProvider 默认符合 UIActivityItemSource 协议(protocol)。这就是您需要实现 subjectForActivityType: 方法的地方。

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

关于ios - 自定义 UIActivity 的主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25781354/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com