点击发送或取消按钮后如何关闭邮件视图控制器

时间:2016-05-15 19:11:00

标签: ios swift mfmailcomposeviewcontroller

发送邮件时,点击发送或取消按钮后,控制器会停留在那里并且app停止。

// swift 2.2; xcode 7.3.1;

  if( MFMailComposeViewController.canSendMail() ) {
            print("Can send email.")
        }

        var subjectText = "Verification"
        var toReceipients = ["notorious.roman@gmail.com"]


        // var msgBody = "Verified"


        var mc:MFMailComposeViewController = MFMailComposeViewController()
        mc.mailComposeDelegate = self

        mc.setSubject(subjectText)
        mc.setMessageBody("Verified", isHTML: false)

        mc.setToRecipients(toReceipients)
        self.presentViewController(mc, animated: true, completion: nil)



    }

    func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {



        self.dismissViewControllerAnimated(true, completion: nil)

    }

3 个答案:

答案 0 :(得分:15)

Swift 4.0更新。 Swift 5.0更新。

请允许我在讨论中添加一些内容......

在Swift 4和5中,委托方法略有改变; 正如你现在发布的那样,没有任何效果,也没有被人打电话。发生在我身上,让我发疯了!

Xcode警告提示三个修复,但前两个可能会产生误导。这只是一个小小的修复......

这是为Swift 3,4和5修复的委托方法:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {

        // Dismiss the mail compose view controller.
        controller.dismiss(animated: true, completion: nil)
    }

但是,Victor的答案应该是正确/可接受的答案。

享受!

答案 1 :(得分:13)

我认为@rmaddy在他的评论中回答了你的问题,然而我会向你解释发生了什么。您试图驳回提出UIViewController而不是MFMailComposeViewController的{​​{1}}。

正如Apple在其文档中指定的那样:

  

邮件撰写视图控制器不会自动解除。当用户点击按钮发送电子邮件或取消界面时,邮件撰写视图控制器会调用其委托的MFMailComposeViewController方法。您对该方法的实现必须明确地忽略视图控制器。

所以你需要以这种方式设置方法:

mailComposeController:didFinishWithResult:error:

我希望这对你有所帮助。

答案 2 :(得分:4)

有一个Switch语句来控制它:

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {

    switch result.rawValue {
    case MFMailComposeResult.cancelled.rawValue :
        print("Cancelled")

    case MFMailComposeResult.failed.rawValue :
        print("Failed")

    case MFMailComposeResult.saved.rawValue :
        print("Saved")

    case MFMailComposeResult.sent.rawValue :
        print("Sent")



    default: break


    }

    self.dismiss(animated: true, completion: nil)

}