2016-10-04 72 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宏法實施之前。另外請注意,最後一個參數必須是NSError類型,而不是Apple建議的文檔(並由Xcode自動完成)建議的錯誤。

1

在浪費了2個好時間之後,我得出了Xcode 8.3的結論。 MFMailComposeViewController不能在混合的swift/objc代碼庫上工作。它彈出了奇怪的編譯錯誤,首先我認爲是由於我的愚蠢,但沒有。

這是如此令人沮喪的蘋果。我們大多數老計時器在obj-c上確實有很多代碼,所以純粹的快速場景幾乎是不可能的。所以,當我把課堂搬到斯威夫特時,我也必須處理額外的痛苦。

0

Swift 4,Xcode 9.1。 我的問題是,MFMailComposeViewController工作正常,但如果您單擊取消,解僱,然後試圖打開它多一次都取消和發送按鈕不會觸發didFinishWith委託功能。 發生這種情況是因爲我宣稱MFMailComposeViewController爲惰性變量,解決方案是每次打開它時都會創建MFMailComposeViewController的新實例。

問題:

lazy var mailComposeViewController: MFMailComposeViewController = { 
    let mailComposeViewController = MFMailComposeViewController() 
    mailComposeViewController.mailComposeDelegate = self 
    mailComposeViewController.setToRecipients(["[email protected].test"]) 
    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 
}