【问题标题】:MFMailComposeViewController didFinishWithResult issue when the keyboard appears出现键盘时的 MFMailComposeViewController didFinishWithResult 问题
【发布时间】:2015-03-01 20:45:58
【问题描述】:

我有一个 MFMailComposeViewController 的标准实现。

我已经设置了正确的委托协议,并且在 didFinishWithResult 方法上发生了日志。

见:

mailComposer = [[MFMailComposeViewController alloc] init];
[mailComposer setSubject:emailTitle];
[mailComposer setMessageBody:messageBody isHTML:YES];
mailComposer.mailComposeDelegate = self;

[[self getController] presentViewController:mailComposer animated:YES completion:NULL];

- (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    NSLog(@"mail dismiss");
    [[self getController] dismissViewControllerAnimated:YES completion:NULL];
}

这可以正确显示邮件编写器,并且一切正常。意思是,如果我按下“取消”按钮,didFinishWithResult 方法会被调用并且 mailComposer 会被关闭。

但是,如果我尝试在邮件编写器本身中输入任何内容,例如 TO: 电子邮件地址或其他任何内容,感觉就像出现的键盘正在删除我的视图控制器的委托操作,因为“取消”和“发送”按钮不会触发任何操作

有什么想法吗?快把我逼疯了:/

干杯

编辑

getController 的代码如下:

- (UIViewController *) getController
{
    Class vcc = [UIViewController class];

    UIResponder *responder = self;
    while ((responder = [responder nextResponder]))
        if ([responder isKindOfClass: vcc])
            return (UIViewController *)responder;

    return nil;
}

【问题讨论】:

  • [self getController] 到底在做什么?
  • @DanielStorm - 它获取当前视图控制器,因为我正在从 UIView 执行此操作。我已经更新了上面的代码以显示该方法。
  • 只是在黑暗中拍摄,但是否有可能从主线程以外的线程调用您的 presentViewController?
  • [self presentViewController..] 没有[[self getController] presentVC..] 就不能工作?
  • 您是否尝试过 [self presentViewController.. while presenting 和 [self dismissViewController.. for dismissing?

标签: ios objective-c mfmailcomposer


【解决方案1】:

当 UITextField 成为FirstResponder 时,你的控制器收到了 resignFirstResponder。

你为什么使用方法“getController”?在显示 MFMailComposeViewController 的 ViewController 上创建属性。

【讨论】:

  • 虽然这感觉像是一个一次性的答案,但它是一个简单的解决方案。我已经对视图控制器进行了子类化,所以我只是向它添加了一个“发送电子邮件”方法,该方法处理电子邮件的存在/关闭。谢谢
【解决方案2】:

设置一个开关来捕获邮件编写器的结果,如下所示:

-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    switch (result) {
        case MFMailComposeResultCancelled:
            // User tapped cancel button
            break;
        case MFMailComposeResultSaved:
            // User saved email
            break;
        case MFMailComposeResultSent:
            // User sent email
            break;
        case MFMailComposeResultFailed:
            break;
        default:
            break;
    }
    [self dismissViewControllerAnimated:YES completion:NULL];
}

【讨论】:

  • 你好丹尼尔。我以前有过,但没有帮助。考虑到“解雇”与结果无关,我看不出这会产生什么影响。 ://
【解决方案3】:

我推荐这个实现:

- (void) presentMailViewController
    if([MFMailComposeViewController canSendMail])
    {
        MFMailComposeViewController *mail = [MFMailComposeViewController new];
        mail.mailComposeDelegate = self;
        mail.navigationBar.tintColor = self.navigationController.navigationBar.tintColor;;
        [self.navigationController presentViewController:mail animated:YES completion:nil];
    }   
}

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    if(error)
    {
       //...
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}   

我建议您阅读此页面: Code Naming Basics

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多