邮件编辑器不会关闭 iOS

Mail Composer won't dismiss iOS

我有 ViewController 按钮和按钮操作:

        - (IBAction)clickMe:(id)sender {
            MailHelper *helper = [[MailHelper alloc] init];
            [helper setAllData:self];
        }

此外,还有用于邮件撰写的助手 class (MailHelper.h):

    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import <MessageUI/MessageUI.h>

    @interface MailHelper : UIViewController<MFMailComposeViewControllerDelegate>

    @property MFMailComposeViewController* mailView;
    - (void)setAllData:(UIViewController *)ctrl;

    @end

和实施(MailHelper.m):

- (void)setAllData:(UIViewController *)ctrl {

    mailView = [[MFMailComposeViewController alloc] init];
    mailView.mailComposeDelegate = self;

    mailView.toRecipients = @[@"mail@email.com"];
    [mailView setSubject:@"Subject"];

    [ctrl presentViewController:mailView animated:YES completion:nil];
}

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {

    [self dismissViewControllerAnimated:YES completion:nil];
}

我可以打开邮件编辑器,但在发送邮件、保存草稿或删除草稿时应用程序崩溃。有什么想法吗?

当请求关闭 MFMailComposeViewController 时,您是在 self 上调用关闭方法,但 self 正在呈现 te MFMailComposeViewController。 变化:

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {

    [self dismissViewControllerAnimated:YES completion:nil];
}

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {

    [controller dismissViewControllerAnimated:YES completion:nil];
}

要解决重新分配问题,请添加以下内容:

在您的 .m 文件中导入 <objc/runtime.h> 并使 self 与传递的控制器关联:

static void * MailHelperKey = &MailHelperKey;

- (void)setAllData:(UIViewController *)ctrl {
mailView = [[MFMailComposeViewController alloc] init];
mailView.mailComposeDelegate = self;

objc_setAssociatedObject(mailView, MailHelperKey, self, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
....
}


-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {

    [controller dismissViewControllerAnimated:YES completion:nil];
    objc_removeAssociatedObjects(controller);
}

这将确保只要呈现控件未被释放您的邮件助手。不值得从美丽的价格,但应该工作。

好的伙计们。解决方案是在其他地方创建 helper 实例,比方说:

@implementation ViewController
MailHelper *helper;

和:

- (IBAction)clickMe:(id)sender {
    helper = [[MailHelper alloc] init];
    [helper setAllData:self];
}