2014-09-11 99 views
4

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

UIActivityItemSource协议的文件中提到,可以实现可选activityViewController:subjectForActivityType:选择,如果你想你的源提供一个主题:

当发布一个项目的服务可以提供一个独立的学科领域,数据字段,例如电子邮件消息。如果您希望为支持其中的服务提供主题字段,请实施此方法。

但是,据我所知,它没有记录在任何地方,我可能实际上指定我的自定义UIActivity支持主题。这是如何完成的?

编辑:为了使我的问题更加清晰

假设我有一个自定义活动项目源,说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

通常情况下,活动项目将是图像,字符串或网址。在这种情况下,我们假设DocumentActivityItemSource返回一个字符串,其中包含关于文档的退出Blurb。 SendWithFooMessageActivity然后可以使用这个文本作为它的foo-mail消息的正文。

但是,Foo消息也要求主题有效。有趣的是,UIActivityItemSource协议还包含可选的activityViewController:subjectForActivityType:,事实上它被记录为提供支持服务的主题。

对于Apple提供的电子邮件活动,实际上会发生 - activityViewController:subjectForActivityType:DocumentActivityItemSource上被调用,并且结果在电子邮件中用作主题。

但是,似乎没有办法指定我的自定义SendWithFooMessageActivity也想从活动项目中获得主题?文档提到这发生在“支持[主题]的服务” - 那么我如何指定我的服务确实支持其中一个。

此外,activityViewController:thumbnailImageForActivityType:suggestedSize:也是如此,它应该为“支持一个的服务”提供缩略图。这适用于默认的ShareOnTwitter和ShareOnFacebook活动,但似乎没有办法让自定义活动支持它。这可能吗?

到目前为止,我已经使用了@chriszumberge下方还提供了解决办法,这是短路activityViewController并直接初始化它来自的ItemSource需要的信息的自定义活动:

[SendWithFooMessageActivity alloc] initWithSubject: document.title]; 

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

回答

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作为一个项目返回?你能得到这个工作的默认苹果提供的邮件,Twitter和Facebook的活动? – AHM 2014-09-29 10:58:23

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

EDIT

UIActivityItemProvder协议定义用于由UIActivityViewController对象来检索数据项作用于方法(直接从苹果文档)。 activityViewController:subjectForActivityType:方法是UIActivityItemSource协议的一部分。

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

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

+0

这也正是我一直在做的,但它看起来像一个kludge,因为协议似乎包括对主题和缩略图的支持。我很困惑为什么自定义UIA不可能获得这些 - 看起来像是苹果的缺陷或疏忽。 – AHM 2014-09-30 06:17:03

+0

@ AHM-我可能误解了你的陈述,但是它不可能让自定义UIActivity使用'activityViewController:subjectForActivityType:'选择器,**除非你让你的定制UIActivity符合[UIActivityItemSource协议](https ://developer.apple.com/library/ios/documentation/uikit/reference/UIActivityItemSource_protocol/index.html)。 – chriszumberge 2014-09-30 12:21:34

+0

也许我误解了一些东西。 'UIActivity'会实现'UIActivityItemSource'吗?据我了解,你的自定义UIActivities应该从UIActivity基础继承,你的活动项目应该实现UIActivityItemSource协议。然后,您将在UIActivityViewController上注册这两个项目和自定义活动,然后会要求用户选择一个活动,并使用提供的项目配置所选项目。我所问的是如何指定我的自定义'UIActivity'想要配置一个主题。 – AHM 2014-10-01 09:53:35