邮件编辑器不会关闭 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];
}
我有 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];
}