如何在UIActivityViewController中设置邮件主题?

74

我想在UIActivityViewController中设置电子邮件分享的主题,同时也想在Twitter上分享。我知道在Twitter上如果我们想分享,需要将文本压缩到140个字符。我查看了许多SO解决方案,但都没有起作用。

这个问题在最新的iOS版本中是否已经解决?还有其他“有效的解决方案”吗?


没有,我已经在下面评论中检查过了,请告诉我是否有错。谢谢。 - Femina
4个回答

97

检查以下代码以获取设置电子邮件主题的电子邮件:

UIActivityViewController* avc = [[UIActivityViewController alloc] initWithActivityItems:@[@"Your String to share"]
                                  applicationActivities:nil];
[avc setValue:@"Your email Subject" forKey:@"subject"];

avc.completionHandler = ^(NSString *activityType, BOOL completed) {
    // ...
};

这里是代码行:

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

如果用户在UIActivityViewController中选择了电子邮件选项,则将主题设置为“您的电子邮件主题”。

希望有所帮助...


1
[activityVC setCompletionHandler:^(NSString *activityType, BOOL completed) { if([activityType isEqualToString: UIActivityTypeMail]){ NSLog(@"选择了邮件类型"); [activityVC setValue:@"分享!" forKey:@"subject"]; } }]; 这段代码不起作用,emreoktem! - Femina
4
在iOS8中似乎无法正常工作,是否有其他方法可以实现这个? - svarrall
有没有办法也设置收件人? - Aanchal Chaurasia
1
这个和activityViewController:subjectForActivityType:都会让电子邮件主题和导航栏标题设置为相同的字符串,这真是令人烦恼。有一个官方且有文档支持的方法来解决这个问题会很好。 - Claus
2
但是当我打开Gmail应用程序时,邮件主题没有显示。我在Gmail主题部分收到正文内容。 - Ansal Antony
显示剩余2条评论

95

似乎emreoktem的解决方案——向UIActivityViewController发送setValue:forKey:——是没有文档记录的。

在 iOS 7 及之后的版本中,你可以通过实现符合 UIActivityItemSource 协议的对象中的 activityViewController:subjectForActivityType: 方法以一种有文档记录的方式来完成此操作。


8
是的,activityViewController:subjectForActivityType: 是正确的解决方案。奇怪的是,iOS Mail 应用程序正确使用了主题,但Google Inbox也使用了消息作为主题(而不是通过subjectForActivityType提供的主题)。 - Leslie Godwin
3
@LeslieGodwin 你有找到通过Gmail分享的解决方案吗? - Zalak Patel
@TimCamber 尽管我已经尝试了上述方法,但在通过Gmail分享时仍然出现问题。请帮忙解决。 - Zalak Patel
@jalakpatel,我不确定你在问什么。你是要分享一些东西到Google Gmail应用程序吗?如果是这样,那么Gmail应用程序没有捕获activityViewController:subjectForActivityType:可能不是UIActivityViewController的错。 - Tim Arnold
谢谢,这是正确的答案。我添加了一个具体类的答案,适用于Swift 3+,我觉得非常有用。 - biomiker

32

根据被接受的答案,这里提供了一个基于Swift 3.0+的具体解决方案。请注意,与被接受的回答一样,这个方案已知仅适用于iOS邮件应用程序,并不一定适用于其他应用程序。

实现:

class MessageWithSubject: NSObject, UIActivityItemSource {

    let subject:String
    let message:String

    init(subject: String, message: String) {
        self.subject = subject
        self.message = message

        super.init()
    }

    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
        return message
    }

    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? {
        return message
    }

    func activityViewController(_ activityViewController: UIActivityViewController,
                                subjectForActivityType activityType: UIActivityType?) -> String {
        return subject
    }
}

用法:

以下是一个使用示例。请注意,在activityItems数组中将其用作第一项并包含任何其他项目会很好地发挥作用:

let message = MessageWithSubject(subject: "Here is the subject", message: "An introductory message")
let itemsToShare:[Any] = [ message, image, url, etc ]

let controller = UIActivityViewController(activityItems: itemsToShare, applicationActivities: nil)

1
以下解决方案不适用于“Gmail”应用程序,只适用于“ios邮件”应用程序。 在Gmail中,正文与消息主题相同。 - Gal Bracha
没错,Gal,就像基于它的被接受的答案一样。我添加了一个注释,使其更明确。 - biomiker
1
类名应以大写字母开头。 - user2878850

19

适用于Swift 2.0+和iOS 8.0+

let title = "Title of the post"
let content = "Content of the post"
let objectsToShare = [title, content]

let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)      
activityVC.setValue(title, forKey: "Subject")
self.presentViewController(activityVC, animated: true, completion: nil)

这对于分享网站链接有效吗?例如[标题、内容、链接]还是URL必须成为内容本身的一部分,并让电子邮件客户端解析并使其可点击? - gadget00
根据被接受的答案,这是未记录且不可靠的。 - biomiker
一个建议是在objectsToShare中不要包含'title',因为在setValue中添加标题会将主题设置为电子邮件中的内容。 对我而言有效。 - AndiAna

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