xcode 6 beta 4 - MessageComposeResult is not conve

2019-02-16 22:30发布

问题:

I have just upgraded from Xcode 6 Beta 3 to Beta 4. In 3 my app was compiling perfectly however in 4 I have the following error. Can anyone explain and provide a solution please.

func messageComposeViewController(sendMsg: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult) {

    switch result {

    case MessageComposeResultSent :    //Error: MessageComposeResult is not convertible to _OptionalNilComparisonType
        label2.text = "Msg Sent"

    case MessageComposeResultCancelled : //Error: MessageComposeResult is not convertible to _OptionalNilComparisonType
        label2.text = "Msg Send Cancelled"

    case MessageComposeResultFailed :   //Error: MessageComposeResult is not convertible to _OptionalNilComparisonType
        label2.text = "Msg Send Failed"

    default:
        label2.text = "Msg Error"

    }

    self.dismissViewControllerAnimated(true, completion: nil)
    self.reloadInputViews()

}

回答1:

It's a bug in the way this module is bridged to Swift. Report it. To use the module, stay in Objective-C until the Swift bridging bug is fixed.

The main part of the bug as it stands seems to me to be:

  • This should be an enum, and it isn't; it's a struct

  • The struct has a value, which ought to be capable of comparison, but it has no getter (you can set it on initialization but you can't get it later)



回答2:

func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) {

    switch result.value {

    case MessageComposeResultSent.value :
        println("enviado")

    case MessageComposeResultCancelled.value :
        println("cancelado")

    case MessageComposeResultFailed.value :
        println("fallo")

    default:
        println("")

    }

}


回答3:

For Swift 2, you will need to use rawValue:

// MARK: MFMessageComposeViewControllerDelegate

func messageComposeViewController(controller:MFMessageComposeViewController, didFinishWithResult result:MessageComposeResult) {
  controller.dismissViewControllerAnimated(true, completion:nil)

  switch result.rawValue {

  case MessageComposeResultSent.rawValue:
    print("cancelado")

  case MessageComposeResultCancelled.rawValue :
    print("canceled...")

  case MessageComposeResultFailed.rawValue :
    print("fail...")

  default:
    print("default...")

  }
}

Of course, if you're just interested in one particular value, you could use an if statement as such:

if (result.rawValue ==  MessageComposeResultCancelled.rawValue) {
  // Message canceled.
}


回答4:

For Swift 3.0, you will need this:

func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult){

    switch result.rawValue {

    case MessageComposeResult.sent.rawValue:
        print("sent")
        break

    case MessageComposeResult.cancelled.rawValue:
        print("cancelled")
        break

    case MessageComposeResult.failed.rawValue:
        print("failed")
        break

    default:
        break
    }

    self.dismiss(animated: true) { () -> Void in

    }
}

@IBAction func sentSMSAction(_ sender: AnyObject) {

    if MFMessageComposeViewController.canSendText() {
        let messageVC = MFMessageComposeViewController()

        messageVC.body = "My first custom SMS";
        messageVC.recipients = ["0123456789"]
        messageVC.messageComposeDelegate = self;

        self.present(messageVC, animated: false, completion: nil)
    }

}


标签: ios swift xcode6