自定义UIActivity的主题

4
如何指定自定义UIActivity支持主题? UIActivityItemSource 协议的文档提到,如果您想要提供主题,可以实现可选的 activityViewController:subjectForActivityType: 选择器:
当发布一个项目时,该服务可能会为单独的主题字段和数据字段(例如电子邮件消息)提供支持。 如果您希望为支持此功能的服务提供主题字段,请实现此方法。
但是,据我所知,没有任何地方记录如何实际指定我的自定义 UIActivity 支持主题。怎么做?
编辑:为了使我的问题更清晰
假设我有一个自定义activity项源,比如 DocumentActivityItemSource,它实现了 UIActivityItemSource 协议,并且我有一个自定义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邮件消息的正文文本。
但是,Foo消息还需要一个主题才能有效。有趣的是,UIActivityItemSource协议还包含可选的activityViewController:subjectForActivityType:,它实际上已记录在支持主题的服务中提供主题。
对于Apple提供的电子邮件活动,确实会发生这种情况-在DocumentActivityItemSource上调用activityViewController:subjectForActivityType:,并将结果用作电子邮件的主题。
然而,似乎没有一种方法可以指定我的自定义SendWithFooMessageActivity也想从activityitem中获取主题?文档提到这适用于“支持[主题]的服务”,那么我该如何指定我的服务确实支持呢。
同样,对于activityViewController:thumbnailImageForActivityType:suggestedSize:也是如此,它应该为“支持一个”的服务提供缩略图。这适用于默认的ShareOnTwitter和ShareOnFacebook活动,但似乎没有办法让自定义活动支持它。这可能吗?
到目前为止,我已经使用了@chriszumberge提供的解决方法,即绕过activityViewController并直接使用来自itemsource的信息初始化自定义活动:
[SendWithFooMessageActivity alloc] initWithSubject: document.title];

但这似乎不是整个UIActivityViewController设置应该使用的方式。

2个回答

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];

编辑

UIActivityItemProvider协议定义了由UIActivityViewController对象使用的方法,以检索要操作的数据项(直接来自苹果文档)。 activityViewController:subjectForActivityType:方法是UIActivityItemSource协议的一部分。

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

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


这也正是我一直在做的事情,但似乎有点笨拙,因为协议似乎包含了对主题和缩略图的支持。我很困惑为什么自定义的UIActivity无法获取这些信息 - 看起来像是苹果的一个缺陷或疏忽。 - AHM
@AHM- 我可能误解了你的陈述,但是除非你让自定义的UIActivity符合UIActivityItemSource协议,否则不可能使用activityViewController:subjectForActivityType:选择器。 - chriszumberge
也许我有什么误解。UIActivity是否应该实现UIActivityItemSource?据我所知,您的自定义UIActivities应该从基本的UIActivity继承,并且您的活动项目应该实现UIActivityItemSource协议。然后,您将在UIActivityViewController上注册项目和自定义活动,然后它会要求用户选择一个活动,并使用提供的项目配置所选的活动。我的问题是如何指定我的自定义UIActivity希望使用主题进行配置。 - AHM
我想说的是,你不能(轻易地)在UIActivity上使用activityViewController:subjectForActivityType:...实际上,你可能不应该这样做。在评论框中输入太多了,请参见我上面的编辑。 - chriszumberge
是的,我知道 - 你在编辑中写的就是我上面试图描述的内容。我也会尝试编辑我的帖子,让我的问题更清晰明了。 - AHM

0

我认为没有自动化的方法可以做到这一点。

相反,您只需手动调用源项目上的协议方法以获取主题。您可以在activityViewController代码或-(void)performActivity方法中执行此操作。

为了安全起见,您可以先检查它是否已实现:

NSString *subject = nil;
if ([item respondsToSelector:@selector(activityViewController:subjectForActivityType:)]
{
     subject = [item activityViewController:activityViewController subjectForActivityType:activityType];
}

1
你是如何实现协议的?我认为UIActivity通常不会访问原始的UIActivityItemSource。据我所知,UIActivityItemSource应该从activityViewController:itemForActivityType:返回一个项目,该项目应该是NSString、UIImage、UIImage或其他内容,具体取决于您想要共享什么。你确定可以将UIActivityItemSource直接返回作为项目吗?你能让默认的Apple提供的邮件、Twitter和Facebook活动正常工作吗? - AHM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接