2015-01-21 12 views
4

Я использую UIActivityViewController для обмена информацией по электронной почте. Мы можем отправить сообщение с телом, вложениями без проблем. Но как мы устанавливаем заголовок темы для письма.Как установить тему почты с помощью UIActivityItemProvider

Я заметил этот вопрос: How to set a mail Subject in UIActivityViewController? Принятое решение использует UIActivityItemSource с этим следующим API activityViewController:subjectForActivityType:. Однако наш код не соответствует UIActivityItemSource, потому что мы используем UIActivityItemProvider.

UIActivityItemSource

Вы можете использовать этот протокол в ситуациях, когда вы хотите предоставить данные от одного из существующих объектов вашего приложения вместо создания отдельного объекта UIActivityItemProvider.

Так что полный вопрос:

Как установить тему сообщения электронной почты, если я использую UIActivityItemProvider вместо UIActivityItemSource?

+1

Посмотрите этот вопрос: http://stackoverflow.com/questions/20581389/how-do-i-use-uiactivityitemprovider-to-send-an-email-with-attachment-with-uiacti – weso

+0

Это классно , Я не знал, что мы все еще можем использовать UIActivityItemProvider, даже не добавляя его явно в UIActivityItemProvider. Спасибо чувак. Это звучит как правильный ответ. –

ответ

6

Определите пользовательского поставщика элемента:

@interface CustomProvider : UIActivityItemProvider 
@end 

Добавить к вашей реализации:

@implementation CustomProvider 

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

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

@end 

Обратите внимание, что UIActivityItemProvider будет автоматически соответствовать протоколу UIactivityItemSource. Разница заключается в том, что вам не нужно реализовывать API @required для протокола UIactivityItemSource.

5

Просто добавьте эту строку после того, как вы создать экземпляр UIActivityViewController:

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

Я использую это так:

- (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]; 
} 
+1

Спасибо, это один из возможных ответов. Тем не менее, мне не очень нравится использование недокументированных api. Я дам ответ, который более изящный, основанный на комментариях. –

1

UIActivityItemProvider содержит протокол UIActivityItemSource. Это прямо в заголовке.

@interface UIActivityItemProvider : NSOperation <UIActivityItemSource> 

так что вы можете просто использовать метод - (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType возвратить предмет в вашем UIActivityItemProvider подкласса.