2017-05-20 8 views
0

MailComposerを使ってみました。ここで私が使用したコードは次のとおりです。MailComposerは解読されません

func setupMailer() { 
    if MFMailComposeViewController.canSendMail() { 
     emailController.mailComposeDelegate = self 
     emailController.setToRecipients([]) // set the email address 
     emailController.setSubject("BackgroundTask Test") 
     emailController.setMessageBody("Message body", isHTML: false) 
    } 
} 

、ユーザーがボタンを押したときに:

func buttonPressed(button: UIButton) { 
    debugPrint("buttonPressed", button) 
    let path = dirpath.appendingPathComponent(filename) 
    let data = NSData(contentsOfFile: path.path) 
    emailController.mailComposeDelegate = self 
    emailController.addAttachmentData(data! as Data, mimeType: "text/csv", fileName: filename) 
    present(emailController, animated: true, completion: nil) 
} 

そして却下:

@objc func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { 
    debugPrint("mailComposeController dismiss") 
    controller.dismiss(animated: true, completion: nil) 
} 

をボタンが押された場合ことが判明しました私が送信またはキャンセルを選択しても、メール作成者は正常に動作します。

ただし、2回目以降の送信/キャンセル後は、メール作成者は解約できません。送信には電子メールを送信できるレスポンスがありますが、メールコンポーザーインターフェイスは決して拒否しません。

最初に機能func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?)がトリガーされなくなったことがわかりました。

手がかりはありますか?

答えて

1

あなたは再び同じMFMailComposeViewControllerインスタンスを使用することになっていません。..

この

func setupMailer() { 
    if MFMailComposeViewController.canSendMail() { 
     emailController = MFMailComposeViewController.init() 
     emailController.mailComposeDelegate = self 
     emailController.setToRecipients([]) // set the email address 
     emailController.setSubject("BackgroundTask Test") 
     emailController.setMessageBody("Message body", isHTML: false) 
    } 
} 
1

よくしてみてくださいあなたは間違ってやっているのか分かりません。 私はあなたがスイフトを使っていると思います。だから私はそれをどのように実装できるかを説明します。手順:

1)import MessagesUIとデリゲートMFMailComposeViewControllerDelegate

2を追加します)は、この機能を追加します。

func configuredMailComposeViewController() -> MFMailComposeViewController { 
    let mailComposerVC = MFMailComposeViewController() 
    mailComposerVC.mailComposeDelegate = self 
    mailComposerVC.setToRecipients(["[email protected]"]) 
    mailComposerVC.setSubject("Sending you an in-app e-mail...") 
    mailComposerVC.setMessageBody("Sending e-mail in-app is not so bad!", isHTML: false) 

    return mailComposerVC 
} 

3)のように、ボタンのIBActionで上記の関数を呼び出します。

let mailComposeViewController = configuredMailComposeViewController() 
    if MFMailComposeViewController.canSendMail() { 
     self.present(mailComposeViewController, animated: true, completion: nil) 
    } else { 
     // Show alert if user can't send mail 
    } 

4 )最後にデリゲートメソッドを実装します。

func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { 
    controller.dismiss(animated: true, completion: nil) 
} 
1

右は、emailControllerインスタンスを再利用する点です。

func setupMailer() { 
if MFMailComposeViewController.canSendMail() { 
    emailController = MFMailComposeViewController() 
    emailController.mailComposeDelegate = self 
    emailController.setToRecipients([]) // set the email address 
    emailController.setSubject("BackgroundTask Test") 
    emailController.setMessageBody("Message body", isHTML: false) 
} 

}

func buttonPressed(button: UIButton) { 
    debugPrint("buttonPressed", button) 
    let path = dirpath.appendingPathComponent(filename) 
    let data = NSData(contentsOfFile: path.path) 
    setupMailer() 
    emailController.addAttachmentData(data! as Data, mimeType: "text/csv", fileName: filename) 
    present(emailController, animated: true, completion: nil) 
    } 

    @objc func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { 
    debugPrint("mailComposeController dismiss") 
    controller.dismiss(animated: true, completion: nil) 
    } 

これが機能するようになりました。

関連する問題