यह प्रदर्शित करता है कि वर्तमान में mailto: ईमेल विषय स्थापित करने और शरीर काम नहीं कर रहा के लिए समाधान, यह किसी भी मामले में नहीं होगा पर्याप्त अगर आप ईमेल निकाय को HTML रखने के लिए सेट करना चाहते हैं और अभी भी UIActivityViewController के माध्यम से ऐप्पल के सिस्टम ईमेल आइकन का उपयोग करना चाहते हैं।
वही था जो हम करना चाहते थे: सिस्टम आइकन का उपयोग करें, लेकिन ईमेल में एक HTML body और एक कस्टम विषय है।
हमारा समाधान एक हैक का था, लेकिन यह कम से कम इस पल के लिए अच्छा काम करता है। इसमें MFMailComposeViewController का उपयोग करना शामिल है, लेकिन यह आपको अभी भी UIActivityViewController के साथ सिस्टम मेल आइकन का उपयोग करने देता है।
चरण 1:
@interface ActivityItemSource : NSObject <UIActivityItemSource>
@property (nonatomic, strong) id object;
- (id) initWithObject:(id) objectToUse;
@end
@implementation ActivityItemSource
- (id) initWithObject:(id) objectToUse
{
self = [super init];
if (self) {
self.object = objectToUse;
}
return self;
}
- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
return self.object;
}
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController
{
return self.object;
}
चरण 2:: एक आवरण वर्ग तो जैसे UIActivityItemSource के अनुरूप बनाएं उपवर्ग UIActivityViewController और एक MFMailComposeViewControllerDelegate में यह इतना की तरह करते हैं:
@interface ActivityViewController : UIActivityViewController <MFMailComposeViewControllerDelegate>
@property (nonatomic, strong) id object;
- (id) initWithObject:(id) objectToUse;
@end
@implementation ActivityViewController
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
switch (result)
{
case MFMailComposeResultSent:
case MFMailComposeResultSaved:
//successfully composed an email
break;
case MFMailComposeResultCancelled:
break;
case MFMailComposeResultFailed:
break;
}
//dismiss the compose view and then the action view
[self dismissViewControllerAnimated:YES completion:^() {
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}];
}
- (id) initWithObject:(id) objectToUse
{
self = [super initWithActivityItems:[NSArray arrayWithObjects:[[ActivityItemSource alloc] initWithObject:objectToUse], nil] applicationActivities:nil];
if (self) {
self.excludedActivityTypes = [NSArray arrayWithObjects: UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, nil];
self.object = objectToUse;
}
return self;
}
नोट: जब आप super initWithActivityItems
पर कॉल कर रहे हैं आप उस ऑब्जेक्ट को लपेट रहे हैं जिसे आप अपनी कस्टम गतिविधि में साझा करेंगे ITemSource
चरण 3: जब उपयोगकर्ता मेल आइकन पर टैप करता है तो सिस्टम के बजाय अपना स्वयं का MFMailComposeViewController लॉन्च करें। mailComposeControllerWithObject
विधि आप MFMailComposeViewController वर्ग का एक उदाहरण का दृष्टांत और इसे सेट अप जो भी डेटा आप चाहते हैं को शामिल करने के लिए
- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
{
if([activityType isEqualToString:UIActivityTypeMail]) {
//TODO: fix; this is a hack; but we have to wait till apple fixes the inability to set subject and html body of email when using UIActivityViewController
[self setEmailContent:activityViewController];
return nil;
}
return self.object;
}
- (void) setEmailContent:(UIActivityViewController *)activityViewController
{
MFMailComposeViewController *mailController = [ShareViewController mailComposeControllerWithObject: self.object withDelegate: activityViewController];
[activityViewController presentViewController:mailController animated:YES completion:nil];
}
:
आप ActivityItemSource कक्षा में activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
विधि में ऐसा होगा। ध्यान दें कि आप लिखें दृश्य के प्रतिनिधि के रूप में activityViewController
सेट करेंगे।
कारण यह काम करता है कि जब एक रचना मोडल प्रदर्शित होता है, तो यह अन्य मॉडलों को प्रदर्शित होने से रोकता है, यानी आप अपना स्वयं का रचना दृश्य प्रदर्शित करते हैं जो प्रणाली को दिखने से दृश्य बनाते हैं। निश्चित रूप से एक हैक, लेकिन यह काम पूरा हो जाता है।
उम्मीद है कि इससे मदद मिलती है।
बहुत भयानक कामकाज – Andy
क्या आप पूरा उदाहरण साझा कर सकते हैं? – Rajeev
क्या यह किसी के लिए काम किया है? यदि ऐसा है तो आप पूर्ण कोड साझा कर सकते हैं? – mKane