MFMailComposeViewController 导航栏按钮被禁用

Posted

技术标签:

【中文标题】MFMailComposeViewController 导航栏按钮被禁用【英文标题】:MFMailComposeViewController navigation bar buttons are disabled 【发布时间】:2012-01-14 07:04:39 【问题描述】:

我使用 MFMailComposeViewController 在我的应用程序中发送邮件。但是当存在邮件撰写视图控制器时,所有导航按钮都被禁用(选择邮件地址屏幕中的后退按钮除外),我必须使用主页按钮退出应用程序。有人有想法吗? 这是屏幕截图:

代码:

- (void)shareVieEmail if ([MFMailComposeViewController canSendMail]) MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; mailViewController.mailComposeDelegate = self; [mailViewController setSubject:@"测试主题"]; [mailViewController setMessageBody:@"邮件正文" ishtml:NO]; NSData *imageData = [NSData dataWithContentsOfFile:photourl]; [mailViewController addAttachmentData:imageData mimeType:@"image/jpg" fileName:@"example_photo"]; [自我presentModalViewController:mailViewController动画:YES]; 别的 [[[UIAlertView alloc] initWithTitle:@"Cannot send mail" message:@"Device is unable to send email in its current state" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show];

委托方法:

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error 切换(结果) 案例 MFMailComposeResultCancelled: //NSLog(@"结果:取消"); 休息; 案例 MFMailComposeResultSaved: //NSLog(@"结果:保存"); 休息; 案例 MFMailComposeResultSent: UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Result" message:@"Mail Sent Successfully" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [警报显示]; 休息; 案例 MFMailComposeResultFailed: UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Result" message:@"Mail Sent Failed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; [警报显示]; 休息; 默认: //NSLog(@"结果:未发送"); 休息; 如果(错误) [[[UIAlertView alloc] initWithTitle:@"Cannot send mail" message:[NSString stringWithFormat:@"ERROR:%@", [error userInfo]] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] 显示] ; [自我dismissModalViewControllerAnimated:是];

在头文件中,我声明了实现 MFMailComposeViewControllerDelegate。

【问题讨论】:

你能显示用于呈现控制器的代码吗? 奇怪,看起来不错。这可能与您的电子邮件设置有关吗?在所有设备上都这样吗? @mvds,它发生在模拟器和设备上。 Apple 的示例项目运行良好。 您是否知道每次呈现MFMailComposeViewController 的实例时都会泄漏?如果第一个实例以某种方式持有某种锁,从而阻止第二个实例获取一个锁,则可能会出现问题。在某处添加一行[mailer autorelease];,删除应用并重新安装。 目前,我使用 ARC 支持来编译项目(编码时不需要自动释放,保留,..),我认为这不是根本原因。但是,我会尝试只编译这个不支持 ARC 的文件。 【参考方案1】:

我遇到了完全相同的问题。我花了一段时间才弄清楚这一点,但毫不奇怪它归结为自定义 UIBarButtonItem

我打赌你的 UIBarButtonItem.h 有一个方法

-(void)setEnabled:(BOOL)enabled ;

实现如下所示:

-(void)setEnabled:(BOOL)enabled 
    if (self.customView) 
        if ([[self.customView.subviews objectAtIndex:0] isKindOfClass:[UIButton class]])         
            ((UIButton*)[self.customView.subviews objectAtIndex:0]).enabled = enabled;
        
    

这会导致问题,因此一旦您注释掉此方法,您的问题就会消失。

【讨论】:

是的! ^^。你说得对!,谢谢!我会重写这个方法。此问题已解决。【参考方案2】:

我也遇到过这个问题,但我的情况是,我已经按照workaround 中针对CNContactViewController 中的错误的建议,从UINavigationController 覆盖了setNavigationBarHidden:animated:。仍然包含解决方法并解决MFMailComposeViewController 中的问题的一种解决方案是使用方法调配来调用原始方法或被覆盖的方法,具体取决于当前topViewController 的类。

【讨论】:

【参考方案3】:

在您的 MFMailComposeViewController 的委托中,您需要实现 didFinishWithResult: 并从那里关闭模态视图控制器。

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
 
    // you can test the result of the mail sending here if you want

    [self dismissModalViewControllerAnimated:YES];

适用于 swift 4.0+

func mailComposeController(controller: MFMailComposeViewController,
                           didFinishWithResult result: MFMailComposeResult, error: NSError?) 
    // Check the result or perform other tasks.

    // Dismiss the mail compose view controller.
    controller.dismissViewControllerAnimated(true, completion: nil)

【讨论】:

我实现了 didFinishWithResult 委托方法。

以上是关于MFMailComposeViewController 导航栏按钮被禁用的主要内容,如果未能解决你的问题,请参考以下文章