現在、メールの件名と本文を設定する mailto: ソリューションが機能していないように見えますが、メール本文に HTML を含めて設定し、Apple のシステム メール アイコンを引き続き使用する場合、これはいずれにせよ適切ではありません。 UIActivityViewController 経由。
システム アイコンを使用し、メールには HTML 本文とカスタム件名を含めます。
私たちの解決策はハックのようなものでしたが、少なくとも今のところはうまく機能しています。MFMailComposeViewController を使用する必要がありますが、UIActivityViewController でシステム メール アイコンを使用できます。
ステップ 1: UIActivityItemSource に準拠するラッパー クラスを次のように作成します。
@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: 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
ときは、カスタムActivityItemSourceで共有するオブジェクトをラップしています
ステップ 3: ユーザーがメール アイコンをタップしたときに、システムの代わりに独自の MFMailComposeViewController を起動します。
activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType
ActivityItemSource クラスのメソッドでこれを行います。
- (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];
}
このmailComposeControllerWithObject
メソッドでは、MFMailComposeViewController クラスのインスタンスをインスタンス化し、必要なデータが含まれるように設定します。activityViewController
を作成ビューのデリゲートとして設定することにも注意してください。
これが機能する理由は、構成モーダルが表示されると、他のモーダルが表示されなくなるためです。つまり、独自の構成ビューを表示すると、システム構成ビューが表示されなくなります。間違いなくハックですが、仕事は完了です。
お役に立てれば。