Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set mail subject with UIActivityItemProvider

I am using UIActivityViewController for sharing information through email. We are able to send email with body, attachments with no problem. But how do we set the subject title for the email.

I notice this question: How to set a mail Subject in UIActivityViewController? The accepted solution is using UIActivityItemSource with this following API activityViewController:subjectForActivityType:. However, our code doesn't conform to UIActivityItemSource because we are using UIActivityItemProvider.

UIActivityItemSource

You can use this protocol in situations where you want to provide the data from one of your app’s existing objects instead of creating a separate UIActivityItemProvider object.

So the complete question is:

How do I set the email subject if I am using UIActivityItemProvider instead of UIActivityItemSource?

like image 329
Yuchen Avatar asked Jan 21 '15 14:01

Yuchen


3 Answers

Define your custom item provider:

@interface CustomProvider : UIActivityItemProvider
@end

Add to your implementation:

@implementation CustomProvider

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

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

@end

Notice that UIActivityItemProvider will automatically conform to UIactivityItemSource protocol. The difference is, you don't have to implement those @required API for UIactivityItemSource protocol.

like image 95
Yuchen Avatar answered Nov 05 '22 18:11

Yuchen


Just add this line after you instantiate your UIActivityViewController:

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

I am using it like this:

- (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];
}
like image 35
sazz Avatar answered Nov 05 '22 20:11

sazz


UIActivityItemProvider implements the UIActivityItemSource protocol. It's right there in the header.

@interface UIActivityItemProvider : NSOperation <UIActivityItemSource>

so you can simply use the method - (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType to return the subject in your UIActivityItemProvider subclass.

like image 2
orkoden Avatar answered Nov 05 '22 19:11

orkoden