web-dev-qa-db-fra.com

Comment définir un objet de messagerie dans UIActivityViewController?

Je souhaite définir le sujet du partage des e-mails dans UIActivityViewController et je souhaite également partager sur Twitter. Je sais sur Twitter si nous voulons partager - nous avons besoin de compresser le texte à 140 caractères. J'ai vérifié de nombreuses solutions SO, mais rien ne fonctionne.

Ce problème est-il résolu dans les dernières versions d'iOS? D'autres "solutions de travail"?

64
Femina

Il semble que la solution d'emreoktem: envoyer setValue:forKey: au UIActivityViewController— n'est pas documenté.

Sur iOS 7 et versions ultérieures, vous pouvez implémenter le activityViewController:subjectForActivityType: méthode dans un objet conforme au protocole UIActivityItemSource pour le faire d'une manière documentée.

86
Tim Camber

Vérifiez ci-dessous le code de l'e-mail pour configurer votre objet de messagerie:

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

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

Voici la ligne

[avc setValue: @ "Votre e-mail Objet" forKey: @ "subject"];

Transforme le sujet en "Sujet de votre e-mail" si l'utilisateur choisit l'option e-mail dans UIActivityViewController.

J'espère que ça aide ...

92
emreoktem

Pour 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)
16
PAC

Voici une solution concrète pour Swift 3.0 + basée sur la réponse acceptée. Notez que, comme la réponse acceptée, cela est connu pour fonctionner uniquement sur l'application iOS Mail et pas nécessairement sur d'autres applications.

La mise en oeuvre:

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
    }
}

Usage:

Voici un exemple d'utilisation. Notez que cela fonctionne bien pour l'utiliser comme premier élément du tableau activityItems et inclure tous les éléments supplémentaires à suivre:

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)
10
biomiker