我有一个类似操作表格的UIView,在其中点击一个按钮后调用了MFMailComposeViewController。虽然MFMailComposeViewController被成功地调用和呈现,但是当我点击取消时它并没有消失,有时还会崩溃。我知道这是一个已知的问题,但我已经尝试了所有已知的解决方法,但都不起作用。以下是我的代码:
SendFeedback.h:
#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
@interface SendFeedback : UIView <UITableViewDelegate, UITableViewDataSource, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate>
//Useless code to the problem.
@property (nonatomic, retain) MFMailComposeViewController *feedBackComposer;
@end
SendFeedback.m:
- (void)baseInit
{
//Useless code to the problem.
feedBackComposer = [[MFMailComposeViewController alloc] init];
[feedBackComposer setMailComposeDelegate:self];
[feedBackComposer setToRecipients:[NSArray arrayWithObject:@"info@getibox.com"]];
[feedBackComposer setMessageBody:@"" isHTML:NO];
[feedBackComposer setSubject:@"What I Love About iBox"];
}
调用composer的方法:
- (void)sendFeedbackComposer
{
[self.window.rootViewController presentViewController:feedBackComposer animated:YES completion:nil];
}
关闭composer的方法:
- (void)mailComposeController:(MFMailComposeViewController *)feedBackComposer didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
//This method doesn't get called.
[self.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
NSLog(@"Error: %@", error);
}
编辑: 所有在此问题中提供的答案都是正确的,而且这是我的错误。我想要做的是:我有一个包括UITableView
的UINavigationController
,其中一个cell
应该通过在其上添加一个作为subview
的操作表格(也是一个UITableView
)来触发操作,就像之前的那个,这个视图也包括cells
,其中之一会执行一个操作并调用MFMailComposeViewController
,它被调用了但是退出时没有成功,即使我已经设置了它的代理和所有方法都是正确的,问题的原因是调用MFMailComposeController
的方式,我首先从父视图中删除了那个小的UITableView
,然后呈现MFMailComposeController
,所以当我关闭邮件编辑器时,它会崩溃而不会给出结果,这让我把崩溃的原因与委托方法混淆了,愚弄了我。
以下是代码:- (void)removeView
{
if (self) {
[UIView animateWithDuration:0.3
animations:^{backgroundView.alpha = 0;}
completion:^(BOOL finished){
[UIView animateWithDuration:.3
animations:^{self.frame = CGRectMake(0, 568, 320, 568);}
completion:^(BOOL finished){[self removeFromSuperview];}];
}];
}
}
- (void)sendFeedbackComposer
{
feedBackComposer = [[MFMailComposeViewController alloc] init];
[feedBackComposer setMailComposeDelegate:self];
[feedBackComposer setToRecipients:[NSArray arrayWithObject:@"info@getibox.com"]];
[feedBackComposer setMessageBody:@"" isHTML:NO];
[feedBackComposer setSubject:@"What I Love About iBox"];
[self.window.rootViewController presentViewController:self.feedBackComposer animated:YES completion:nil];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.row) {
case 2: //That's the index of the MailComposer caller.
[self removeView];
[self sendFeedbackComposer];
break;
case 6:
[self removeView];
break;
default:
break;
}
}
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
[feedBackComposer.presentingViewController dismissViewControllerAnimated:YES completion:nil];
NSLog(@"Error: %@", error);
}
感谢 Stefan Atanasov、Jim 和 Vitaly S.
sendFeedbackComposer
方法是从其他类中调用的吗? - RobertUITableViewDelegate
就是一个代理,而且使用起来非常简单。 - Abdelrahman Eid