2016-10-04 12 views
3

私はいくつかのアプリケーションでメールコンポーザーを使用していましたが、最近ではmailComposeDelegateはもう呼び出しをしません。
これはSwiftの新しいリリースと関係があるかどうかはわかりませんでした。
だから、他の誰かが似たような問題を抱えているかどうか聞いてみると思った。
私はメールのコンポーザーを提示できますが、デリゲートが機能していないため決して解雇されません。以下はMFMailComposeViewControllerDelegateが動作しません。Swift 3

私が使用してされていないコードの正確なコピーである:

func launchFeedback() { 
    guard MFMailComposeViewController.canSendMail() else { 
     return 
    } 

    let emailTitle = "Feedback" 
    let messageBody = "" 
    let toRecipents = ["[email protected]"] 
    mailComposer.mailComposeDelegate = self 
    mailComposer.setSubject(emailTitle) 
    mailComposer.setMessageBody(messageBody, isHTML: false) 
    mailComposer.setToRecipients(toRecipents) 
    self.show(mailComposer, sender: self) 
} 

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

答えて

1

スウィフト3は、もはや(this proposalを参照)デフォルトでは、名前の最初のパラメータを持っているので、あなたにアンダースコアを追加する必要があります関数:

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

これは明らかにXcodeのバグです。 (時間StackOverflowの寿命かかわらず検索した後に)これ​​を回避する唯一の方法は、このれました:

@objc(mailComposeController:didFinishWithResult:error:) 
    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult,error: NSError?) { 
     controller.dismiss(animated: true) 
    } 

は、メソッドの実装前に@objcマクロを参照してください。また、最後のパラメータは、Appleのドキュメントで提案されているように、エラーではなくNSErrorタイプでなければならないことに注意してください(Xcodeでオートコンプリート)

1

2時間を無駄にした後、Xcode 8.3 MFMailComposeViewControllerは、混在したスピーディ/ objcコードベースでは機能しません。それは奇妙なコンパイルエラーを引き起こします。最初は私の愚かさによると思っていましたが、いいえ。

これはとてもうれしいリンゴです。ほとんどの私たちの古いタイマーはobj-cでたくさんのコードを持っているので、純粋な迅速なシナリオは不可能に近いです。クラスを速く動かすと、余計な苦痛にも対処しなくてはなりません。

0

スウィフト4、Xcode 9.1。 私の問題は、MFMailComposeViewControllerがうまくいきましたが、キャンセルをクリックして閉じるともう一度開こうとすると、キャンセルボタンと送信ボタンの両方がdidFinishWithデリゲート機能を起動しません。 私はMFMailComposeViewControllerを遅延変数として宣言しており、ソリューションを開こうとするたびにMFMailComposeViewControllerの新しいインスタンスを作成するということが起こっていました。

問題:

lazy var mailComposeViewController: MFMailComposeViewController = { 
    let mailComposeViewController = MFMailComposeViewController() 
    mailComposeViewController.mailComposeDelegate = self 
    mailComposeViewController.setToRecipients(["[email protected]"]) 
    mailComposeViewController.setSubject("subject") 
    mailComposeViewController.setMessageBody("test body", isHTML: false) 
    return mailComposeViewController 
}() 

ソリューション:

func createMailComposeViewController() -> MFMailComposeViewController { 
    let mailComposeViewController = MFMailComposeViewController() 
    mailComposeViewController.mailComposeDelegate = self 
    mailComposeViewController.setToRecipients(["[email protected]"]) 
    mailComposeViewController.setSubject("subject") 
    mailComposeViewController.setMessageBody("test body", isHTML: false) 
    return mailComposeViewController 
} 
関連する問題