【发布时间】:2014-01-25 14:59:23
【问题描述】:
我有某种操作表 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"];
}
然后调用作曲家: - (void)sendFeedbackComposer { [self.window.rootViewController presentViewController:feedBackComposer 动画:YES 完成:nil]; }
解除它:
- (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);
}
编辑:所以,这个问题中提供的所有答案都是正确的,这都是我的错。我想做的是:我有一个UINavigationController,其中包括一个UITableView,其中一个cells应该通过将其添加为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方法是从其他类调用的? -
不,来自同一个类,它是一个 UIView。
-
这个类的其他实现的委托是否工作正常?
-
是的,一个是
UITableViewDelegate,它很容易工作。
标签: ios objective-c uiview delegates mfmailcomposer