Wie lege ich einen E-Mail-Betreff in UIActivityViewController fest?

69

Ich möchte den Betreff für das Teilen von E-Mails festlegen UIActivityViewControllerund auch auf Twitter teilen. Ich weiß auf Twitter, ob wir teilen möchten - wir müssen Text auf 140 Zeichen komprimieren. Ich habe viele SO-Lösungen überprüft, aber nichts funktioniert.

Ist dieses Problem in den neuesten iOS-Versionen behoben? Irgendwelche anderen "funktionierenden Lösungen"?

Femina
quelle
Nein, das ist es nicht. Überprüfen Sie einfach meinen Kommentar unten und lassen Sie mich wissen, wenn ich den richtigen Weg vermisse. Vielen Dank
Femina

Antworten:

90

Es scheint, als ob die Lösung von emreoktem - das Senden setValue:forKey:an die UIActivityViewController- nicht dokumentiert ist.

Unter iOS 7 und höher können Sie die activityViewController:subjectForActivityType:Methode in einem Objekt implementieren, das dem UIActivityItemSourceProtokoll entspricht, um dies auf dokumentierte Weise zu tun.

Tim Arnold
quelle
8
Ja, activityViewController:subjectForActivityType:ist die richtige Lösung. Seltsamerweise verwendet die iOS Mail-App den Betreff korrekt, aber Google Inbox verwendet die Nachricht auch für den Betreff (nicht den Betreff, der über bereitgestellt wird subjectForActivityType)
Leslie Godwin
3
@LeslieGodwin Haben Sie eine Lösung für das Teilen über Google Mail gefunden?
Zalak Patel
@ TimCamber Obwohl ich oben versucht habe, zeigt es immer noch Probleme durch das Teilen in Google Mail. Bitte helfen Sie zu lösen
Zalak Patel
@ Jalakpatel Ich bin nicht sicher, was Sie fragen. Teilen Sie etwas mit der Google Google Mail-App? In diesem Fall ist es möglicherweise nicht die UIActivityViewControllerSchuld, dass die Google Mail-App nicht funktioniert activityViewController:subjectForActivityType:.
Tim Arnold
Danke, das ist die richtige Antwort. Ich habe eine Antwort mit einer konkreten Klasse für Swift 3+ hinzugefügt, die ich sehr nützlich fand.
Biomiker
94

Überprüfen Sie den folgenden Code für die E-Mail, um Ihren E-Mail-Betreff einzurichten:

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

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

Hier die Linie

[avc setValue: @ "Ihr E-Mail-Betreff" forKey: @ "Betreff"];

Legt den Betreff als "E-Mail-Betreff" fest, wenn der Benutzer die E-Mail-Option im UIActivityViewController auswählt.

Ich hoffe, es hilft...

emreoktem
quelle
1
[activityVC setCompletionHandler: ^ (NSString * activityType, BOOL abgeschlossen) {if ([activityType isEqualToString: UIActivityTypeMail]) {NSLog (@ "Mail type selected"); [activityVC setValue: @ "Teilen!" forKey: @ "subject"]; }}]; Es funktioniert nicht emreoktem!
Femina
@Meenu Sie sollten den Betreff vor dem Abschluss-Handler festlegen .
Colinta
3
Dies scheint in iOS8 nicht zu funktionieren. Gibt es eine andere Möglichkeit, dies zu tun?
Svarrall
1
Dies und der activityViewController: subjectForActivityType: setzen den E-Mail-Betreff und den Titel der Navigationsleiste ärgerlicherweise auf dieselbe Zeichenfolge. Es wäre schön, einen offiziellen und dokumentierten Weg zu haben, dies zu tun.
Claus
2
Aber der Betreff der E-Mail wird nicht angezeigt, wenn ich die Google Mail-Anwendung öffne. Ich erhalte Body-Inhalte im Abschnitt zum Betreff der Google Mail
Ansal Antony
23

Hier ist eine konkrete Lösung für Swift 3.0+ basierend auf der akzeptierten Antwort. Beachten Sie, dass dies wie die akzeptierte Antwort nur für die iOS Mail-App und nicht unbedingt für andere Apps funktioniert.

Implementierung:

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

Verwendung:

Hier ist ein Anwendungsbeispiel. Beachten Sie, dass es gut funktioniert, dies als erstes Element im Array activityItems zu verwenden und alle folgenden zusätzlichen Elemente einzuschließen:

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)
Biomiker
quelle
1
Die folgende Lösung funktioniert nicht für die GmailApp, sondern nur für ios Mail app. In Google Mail wird der Körper genauso angezeigt wie ein Betreff der Nachricht
Gal Bracha
Das ist wahr, Gal, genau wie die akzeptierte Antwort, auf der es basiert. Ich habe einen Kommentar hinzugefügt, um dies deutlicher zu machen.
Biomiker
1
Der Klassenname sollte mit einem Großbuchstaben beginnen.
user2878850
18

Für Swift 2.0+ und 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)
PAC
quelle
funktioniert dies zum Teilen eines Links zu einer Website? wie [Titel, Inhalt, Link] oder muss die URL Teil des Inhalts selbst sein und vom E-Mail-Client analysiert und anklickbar gemacht werden?
Gadget00
Gemäß der akzeptierten Antwort ist dies nicht dokumentiert und unzuverlässig.
Biomiker