Reputation: 12534
I realize this question has been inexactly asked around, but I haven't been able to find an answer to my problem.
I have a UITableViewController with static cells. One of these cells is meant to open a Mail Composer view, and dismiss it through the delegate after the user sends or cancels the email. My problem is that the delegate method is not being called. Here is my code:
class SideMenuTableViewController: UITableViewController, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
mailCVP.delegate = self
mailCVP = configureMailComposeVC()
if MFMailComposeViewController.canSendMail() {
self.presentViewController(mailCVP, animated: true, completion: nil)
} else { //..// }
}
func configureMailComposeVC() -> MFMailComposeViewController {
let mailComposerVC = MFMailComposeViewController()
mailComposerVC.setToRecipients(["[email protected]"])
mailComposerVC.setSubject("Contacto Momentos de Tora")
return mailComposerVC
}
func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
controller.dismissViewControllerAnimated(true, completion: nil)
}
Can anybody spot anything I might be doing wrong?
Thanks.
Upvotes: 3
Views: 1785
Reputation: 4064
First of all use
mailCVP.mailComposeDelegate = self
instead of
mailCVP.delegate = self
Moreover, in case of Swift 3, delegate method is somehow updated which is:
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?){
controller.dismiss(animated: true, completion: nil)
}
Upvotes: 1
Reputation: 334
Make sure you use
controller.mailComposeDelegate = self
Not this one
controller.delegate = self
Upvotes: 6
Reputation: 19932
MFMailComposeViewController
is a subclass of UINavigationController
, which already has a delegate
property to handle navigation changes.
MFMailComposeViewController
has another property called mailComposeDelegate
, which is the property you are looking for.
Also, you should create the controller before setting the delegate.
Upvotes: 8
Reputation: 119041
mailCVP.delegate = self
mailCVP = configureMailComposeVC()
This code sets the delegate but then creates a new instance, which doesn't have a delegate...
Note that there is also no point in creating the VC instance if MFMailComposeViewController.canSendMail
returns false
.
Upvotes: 1