2014-06-19 9 views
28

Si tratta di codice di esempio:MFMailComposeViewController a Swift

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) 
    } 
} 

In funzione mailComposeController ottengo un errore in tutti i casi espressione:

Impossibile trovare un sovraccarico '~ =' che accetta gli argomenti forniti.

Cosa sto sbagliando?

+1

Hai provato a convertire i casi 'switch' in _Swift_-conforme? come 'case MFMailComposeResult.Cancelled:' ect ...? Non sono riuscito a trovare il riferimento a questo 'enum' in _Swift_, quindi la mia idea sarebbe piuttosto una domanda che una soluzione pura. – holex

+1

Appena provato: MFMailComposeResult.Type non ha un membro chiamato 'Cancellato', ecc. –

+0

suggerimento: ove possibile si dovrebbe usare 'let' invece di' var' – David

risposta

31

Ho confrontato MFMailComposeResult documentazione sia Xcode 5 e Xcode 6. In Swift, MFMailComposeResult è una struct

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

con MFMailComposeResultCancelled come una costante di tipo MFMailComposeResult:

var MFMailComposeResultCancelled: MFMailComposeResult { get } 

mentre è un enum in Objective-C:

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

Per far funzionare il tuo codice, dovrai confrontare i loro valori che sono CUnsignedInt.

Quindi si dovrà digitare il seguente codice:

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

Quando premo il pulsante, la funzione showEmail viene eseguita e appare il modulo per inviare e-mail. Se faccio clic su "Invia", quindi tutto funziona correttamente - la posta viene inviata, quindi viene eseguita la funzione mailComposeController. NSLog visualizza l'etichetta "Posta inviata" e la schermata iniziale riappare. Se sono nella finestra di dialogo di invio posta, fare clic sul pulsante "Annulla", quindi il dialogo non scompare, la funzione mailComposeController non funziona, due pulsanti - "Invia" e "Annulla", diventano di colore grigio e quindi rimane . Cosa male? –

+0

Sembra un bug dalla prima beta, puoi vederlo [qui] (http://stackoverflow.com/questions/24218708/cant-dismiss-mfmailcomposeviewcontroller-shown-by-clicking-mail-link-in-uitextvi ? rq = 1) –

+0

@AudreySobgouZebaze. La tua associazione di MFComposeResult come struct in iOS8 e enum in iOS7 non è del tutto corretta.MFMailComposeResult è un enum in Objective-C ed è ora una struct in Swift (indipendentemente dalla versione del sistema operativo, o SDK: iOS 7/iOS 8) ... e – eharo2

19

in Swift 2.0 fare questo:

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

a 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

funziona correttamente in 2.3 rapido –

0

a Swift 3, è possibile utilizzare questo codice chiaro:

@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) 

    }