2014-06-19 77 views
28

這是示例代碼:MFMailComposeViewController在夫特

import UIKit 
import MessageUI 

class ViewController: UIViewController, MFMailComposeViewControllerDelegate { 

    @IBAction func showEmail(sender : AnyObject) { 
     var emailTitle = "Test Email" 
     var messageBody = "This is a test email body" 
     var toRecipents = ["[email protected]"] 
     var mc: MFMailComposeViewController = MFMailComposeViewController() 
     mc.mailComposeDelegate = self 
     mc.setSubject(emailTitle) 
     mc.setMessageBody(messageBody, isHTML: false) 
     mc.setToRecipients(toRecipents) 

     self.presentViewController(mc, animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) { 
     switch result { 
     case MFMailComposeResultCancelled: 
      NSLog("Mail cancelled") 
     case MFMailComposeResultSaved: 
      NSLog("Mail saved") 
     case MFMailComposeResultSent: 
      NSLog("Mail sent") 
     case MFMailComposeResultFailed: 
      NSLog("Mail sent failure: %@", [error.localizedDescription]) 
     default: 
      break 
     } 
     self.dismissViewControllerAnimated(false, completion: nil) 
    } 
} 

在功能mailComposeController我在每個情況表達得到一個錯誤:

找不到過載 '〜=' 接受提供的參數。

我在做什麼錯?

+1

你試圖在'之開關的情況下轉換成_Swift_,符合?比如'case MFMailComposeResult.Cancelled:'ect ...?在_Swift_中找不到關於這個'enum'的參考,所以我的想法不是純粹的解決方案而是一個問題。 – holex

+1

剛剛嘗試過:MFMailComposeResult.Type沒有名爲'Cancelled'的成員等 –

+0

提示:只要有可能,應該用'let'代替'var' – David

回答

31

我比較了這兩種的Xcode 5和的Xcode 6. 在夫特MFMailComposeResult文檔,MFMailComposeResult是一個結構

struct MFMailComposeResult { 
    init(_ value: CUnsignedInt) // available in iPhone 3.0 
    var value: CUnsignedInt 
} 

MFMailComposeResultCancelled作爲MFMailComposeResult類型的一個常數:

var MFMailComposeResultCancelled: MFMailComposeResult { get } 

,而它的一個Objective-C中的枚舉:

enum MFMailComposeResult { 
    MFMailComposeResultCancelled, 
    MFMailComposeResultSaved, 
    MFMailComposeResultSent, 
    MFMailComposeResultFailed 
}; 
typedef enum MFMailComposeResult MFMailComposeResult; // available in iPhone 3.0 

爲了使您的代碼正常工作,您必須比較它們的值爲CUnsignedInt

所以,你必須輸入以下代碼:

func mailComposeController(controller:MFMailComposeViewController, didFinishWithResult result:MFMailComposeResult, error:NSError) { 
    switch result.value { 
    case MFMailComposeResultCancelled.value: 
     println("Mail cancelled") 
    case MFMailComposeResultSaved.value: 
     println("Mail saved") 
    case MFMailComposeResultSent.value: 
     println("Mail sent") 
    case MFMailComposeResultFailed.value: 
     println("Mail sent failure: \(error.localizedDescription)") 
    default: 
     break 
    } 
    self.dismissViewControllerAnimated(false, completion: nil) 
} 
+0

當我按下按鈕時,函數showEmail被執行並出現表格發送電子郵件。如果我點擊「發送」,那麼一切正常 - 發送郵件,然後執行函數mailComposeController。 NSLog顯示標籤「郵件發送」,並且初始屏幕再次出現。 如果我在發送郵件對話框中單擊「取消」按鈕,然後對話框不會消失,函數mailComposeController不起作用,兩個按鈕 - 「發送」和「取消」,變成灰色,所以它保持不變。 有什麼不對? –

+0

它似乎是自第一個測試版以來的錯誤,你可以看到它[這裏](http://stackoverflow.com/questions/24218708/cant-dismiss-mfmailcomposeviewcontroller-shown-by-clicking-mail-link-in-uitextvi ?rq = 1) –

+0

@AudreySobgouZebaze。您在iOS8中的結構與MFComposeResult的關聯和iOS7中的枚舉不完全正確。MFMailComposeResult是一個Objective-C中的枚舉,它現在是Swift中的一個結構體(無論操作系統版本或SDK:iOS 7/iOS 8)... e – eharo2

19

在Swift 2.0中執行此操作:

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) { 
     switch result.rawValue { 
     case MFMailComposeResultCancelled.rawValue: 
      print("Mail cancelled") 
     case MFMailComposeResultSaved.rawValue: 
      print("Mail saved") 
     case MFMailComposeResultSent.rawValue: 
      print("Mail sent") 
     case MFMailComposeResultFailed.rawValue: 
      print("Mail sent failure: \(error!.localizedDescription)") 
     default: 
      break 
     } 
     controller.dismissViewControllerAnimated(true, completion: nil) 
    } 
6

In swift 3.0 - > Syntax Change

func mailComposeController(controller: MFMailComposeViewController, 
          didFinishWithResult result: MFMailComposeResult, error: NSError?) { 

    switch result.rawValue { 
    case MFMailComposeResult.Cancelled.rawValue: 
     print("Mail cancelled") 
    case MFMailComposeResult.Saved.rawValue: 
     print("Mail saved") 
    case MFMailComposeResult.Sent.rawValue: 
     print("Mail sent") 
    case MFMailComposeResult.Failed.rawValue: 
     print("Mail sent failure: %@", [error!.localizedDescription]) 
    default: 
     break 
    } 
    // Dismiss the mail compose view controller. 
    controller.dismissViewControllerAnimated(true, completion: nil) 
} 
+1

在swift 2.3中正常工作 –

0

在迅速3,您可以使用此代碼清晰:

@IBAction func sendMail(_ sender: Any) { 

     print(MFMailComposeViewController.canSendMail()) 
     if MFMailComposeViewController.canSendMail() { 
      let mail = MFMailComposeViewController() 
      mail.mailComposeDelegate = self 
      mail.setToRecipients(["[email protected]"]) 
      mail.setMessageBody("<p>This is test Mail!</p>", isHTML: true) 

      present(mail, animated: true) 
     } else { 
      let email = "[email protected]" 
      if let url = URL(string: "mailto:\(email)") { 
      UIApplication.shared.open(url) 
      } 

     } 


    } 

    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { 
     controller.dismiss(animated: true) 
     switch result { 
     case .cancelled: 
      print("Mail cancelled") 
     case .saved: 
      print("Mail saved") 
     case .sent: 
      self.allertInfo(_title: "Mail Info", _message: "Mail is sent successfuly", _actionTitle: "OK") 
      print("Mail sent") 
     case .failed: 
      self.allertInfo(_title: "Mail Info", _message: "Mail isn't sent.", 
_actionTitle: "OK") 
      print("Mail sent failure: \(error?.localizedDescription)") 
     default: 
      break 
     } 

    } 

    func allertInfo(_title:String, _message:String, _actionTitle:String) { 

     let alert = UIAlertController(title: _title, message: _message, preferredStyle: UIAlertControllerStyle.alert) 
     alert.addAction(UIAlertAction(title: _actionTitle, style: UIAlertActionStyle.default, handler: nil)) 
     self.present(alert, animated: true, completion: nil) 

    }