Ios 如何使用UIActivityItemProvider设置邮件主题

Ios 如何使用UIActivityItemProvider设置邮件主题,ios,objective-c,email,uiactivityviewcontroller,Ios,Objective C,Email,Uiactivityviewcontroller,我正在使用UIActivityViewController通过电子邮件共享信息。我们能够发送电子邮件与身体,附件没有问题。但是我们如何设置电子邮件的主题标题呢 我注意到这个问题: 公认的解决方案是将UIActivityItemSource与以下API一起使用。但是,我们的代码不符合UIActivityItemSource,因为我们使用的是UIActivityItemProvider UIActivityItemSource 如果希望从应用程序的现有对象之一提供数据,而不是创建单独的UIActiv

我正在使用
UIActivityViewController
通过电子邮件共享信息。我们能够发送电子邮件与身体,附件没有问题。但是我们如何设置电子邮件的主题标题呢

我注意到这个问题: 公认的解决方案是将
UIActivityItemSource
与以下API一起使用。但是,我们的代码不符合
UIActivityItemSource
,因为我们使用的是
UIActivityItemProvider

UIActivityItemSource

如果希望从应用程序的现有对象之一提供数据,而不是创建单独的UIActivityItemProvider对象,则可以使用此协议

因此,完整的问题是:


如果我使用的是
UIActivityItemProvider
而不是UIActivityItemSource,如何设置电子邮件主题?

在实例化UIActivityViewController后,只需添加此行即可:

[activityController setValue:@"Your email Subject" forKey:@"subject"];
我是这样使用它的:

- (void)share {
    NSArray *activityItems;

    NSString *texttoshare = [NSString stringWithFormat:@"Hey bro! check this info.\n%@\n%@", self.infoBean.title, self.infoBean.desc];
    UIImage *imagetoshare = imageView.image;//this is your image to share

    if (imagetoshare != nil) {
    activityItems = @[imagetoshare, texttoshare];
    } else {
    activityItems = @[texttoshare];
    }
    NSArray *exTypes = @[UIActivityTypeAssignToContact, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeSaveToCameraRoll];


    UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    activityController.excludedActivityTypes = exTypes;


    [activityController setValue:@"Your email Subject" forKey:@"subject"];

    [self presentViewController:activityController animated:YES completion:nil];
}

定义自定义项目提供程序:

@interface CustomProvider : UIActivityItemProvider
@end
添加到您的实现中:

@implementation CustomProvider

// Some other code ... -(id)item and etc. 

- (NSString *) activityViewController:(UIActivityViewController *)activityViewController
               subjectForActivityType:(NSString *)activityType
{
      return @"A dummy Title";
}

@end

请注意,
UIActivityItemProvider
将自动符合
UIactivityItemSource
协议。区别在于,您不必为
UIactivityItemSource
协议实现那些
@必需的
API

UIActivityItemProvider
实现
UIActivityItemSource
协议。就在页眉上

@interface UIActivityItemProvider : NSOperation <UIActivityItemSource>
@interface UIActivityItemProvider:NSOperation

因此,您可以简单地使用方法
-(NSString*)activityViewController:(UIActivityViewController*)activityViewController subjectForActivityType:(NSString*)activityType
返回
UIActivityItemProvider
子类中的主题。

看这个问题:这有点酷。我不知道我们仍然可以使用UIActivityItemProvider,甚至不需要显式地将其添加到UIActivityItemProvider。谢谢你,伙计。这听起来是正确的答案。谢谢,这是一个可能的答案。然而,我不太喜欢使用未记录的api。我将根据评论提供一个更优雅的答案。