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.

  • iOS - 3 duplicate symbols for architecture i386
  • xcodebuild workspace and scheme
  • Animating custom-drawn UITableViewCell when entering edit mode
  • MKMapView: Instead of Annotation Pin, a custom view
  • looping through an NSMutableDictionary
  • How to pause and resume UIView.animateWithDuration
  • 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?

    3 Solutions Collect From Internet About “How to set mail subject with UIActivityItemProvider”

    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.

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

    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.