2017-05-20 15 views
-1

インスタンス化されたときに、別のViewControllerにMFMailComposeViewControllerを表示するDataHandlerオブジェクトがあります。別のViewControllerからMFMailComposeViewControllerを閉じることができません

例えば、クラスでは、私はIBActionその電子メールデータを持っているし、そうするために、データハンドラを呼び出す:データハンドラは、この行い

@IBAction func exportData(_ sender: Any) { 
    let dh = DataHandler() 
    dh.sendEmail(vc: self) 
} 

func configureEmail() -> MFMailComposeViewController{ 
    let mailComposerVC = MFMailComposeViewController() 
    let dataHandler = DataHandler() 
    let data = dataHandler.getData(fileName: file!) 
    mailComposerVC.mailComposeDelegate = self 
    mailComposerVC.setToRecipients([emailAddr!]) 
    mailComposerVC.setSubject("blah!") 
    mailComposerVC.addAttachmentData(data as Data, mimeType: "text/csv", fileName: "file.csv") 
    return mailComposerVC 
} 

func sendEmail(vc: UIViewController){ 
    if MFMailComposeViewController.canSendMail() { 
     let emailClient = configureEmail() 
     vc.show(emailClient, sender: vc) 
    } 
    else{ 
     print("Unable to send emails") 
    } 
} 

を私ができますよただし、電子メールを送信するには、送信後にView Controllerを閉じることができません。私はすでにDataHandlerにこれを挿入しました

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

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

私は解決策のためにインターネットを磨き、知恵袋で終わりです。助けてください! :)

編集1: 変更controller.dismiss(アニメーション:真、完了を:ゼロ)self.dismissする(アニメーション:真、完了:ゼロ)

+0

まず、このコントローラを提示する必要があります。 mailComposerVC.mailComposeDelegate =自己 – Mannopson

答えて

0

あなたがデリゲートを設定する必要があります。

mailComposerVC.mailComposertDelegate = self 
+0

こんにちは、私は私がやったことを考えましたか? mailComposertVCは終了しなければなりませんが、親のvcは終了しません。 –

+0

が呼び出されるデリゲートメソッドです: –

+0

あなたはメールVCを却下するものを意味しますか? –

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

は、IBActionの範囲外で定義されました。そのため、MFMailComposeViewControllerを閉じるために必要なDataHandlerオブジェクトは、dismiss関数のスコープと同じではありませんでした。解決策は、DataHandler関数を呼び出すクラスの変数としてDataHandlerオブジェクトを宣言することでした。

関連する問題