【问题标题】:In App SMS With Attachment - MFMessageComposeViewControllerDelegate Related ErrorsIn App SMS with Attachment - MFMessageComposeViewControllerDelegate 相关错误
【发布时间】:2016-01-30 20:57:36
【问题描述】:

我有以下代码在应用内拍摄我的屏幕的部分快照,然后打开一个 SMS 对话窗口。

import UIKit
import MessageUI
import AVFoundation


class ViewController: UIViewController, MFMailComposeViewControllerDelegate
{


@IBAction func smsScreenShot(sender: AnyObject) {

    audioPlayer.play()

    // Declare the snapshot boundaries 
    let top: CGFloat = 100
    let bottom: CGFloat = 60

    // The size of the cropped image
    let size = CGSize(width: view.frame.size.width, height: view.frame.size.height - top - bottom)

    // Start the context
    UIGraphicsBeginImageContext(size)
    CGContextTranslateCTM(context, 0, -top)

    // Draw the view into the context (this is the snapshot)
    view.layer.renderInContext(context)
    let snapshot = UIGraphicsGetImageFromCurrentImageContext()

    // End the context (this is required to not leak resources)
    UIGraphicsEndImageContext()

    // Composing the SMS

    if !MFMessageComposeViewController.canSendText() {
        print("SMS services are not available")
    }

    if (MFMessageComposeViewController.canSendText()) {

        let composeVC = MFMessageComposeViewController()

        composeVC.recipients = ["Enter tel no"]
        composeVC.body = "Have a look at this cool image!";

        // Attaching the image to the SMS.
        let image = snapshot
        let imageData = UIImagePNGRepresentation(image)
        composeVC.addAttachmentData(imageData!, typeIdentifier: "image/png", filename:"myImage")

        self.presentViewController(composeVC, animated:true, completion:nil)

    }

}

我意识到我必须在“MFMailComposeViewControllerDelegate”之后的class 构造中添加MFMessageComposeViewControllerDelegate。

这样做时,我收到以下错误:

Type 'ViewController' does not conform to protocol 'MFMessageComposeViewControllerDelegate'

这是因为我没有解散控制器。

为了关闭 MFMMessageComposeViewController,我添加了以下代码:

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

switch result.value {
case MessageComposeResultCancelled.value:
    NSLog("cancelled")
case MessageComposeResultFailed.value:
    NSLog("cancelled")
case MessageComposeResultSent.value:
    NSLog("cancelled")
default:
    NSLog("default...")
}
controller.dismissViewControllerAnimated(true, completion: nil)
}

然后我插入了这段代码:

self.presentViewController(composeVC, animated:true, completion:nil)

但是现在我遇到了同样的Type 'ViewController' does not conform to protocol 'MFMessageComposeViewControllerDelegate' 错误以及 switch 语句中的错误。

Switch 语句错误

首先,我在使用result.value 时出错,所以我将其更改为result.rawValue。这似乎解决了这个错误。

但我现在在 case 语句中有错误:Value of type 'MessageComposeResult' has no member 'value'。我认为这是因为 MessageComposeResult 周围的语法已经过时或错误?

如何修正我的案例陈述?我想如果我修正案例陈述,我的所有问题都会得到解决?

我花了好几个小时在网上搜索类似的问题和资料,但在这里真的很难过。

谁能告诉我哪里出错了?以及如何修改我的代码?

非常感谢。

修改后的代码

import UIKit
import MessageUI
import AVFoundation


    class ViewController: UIViewController, MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate {

   // Composing the SMS

    if !MFMessageComposeViewController.canSendText() {
        print("SMS services are not available")
    }

    if (MFMessageComposeViewController.canSendText()) {


        let composeVC = MFMessageComposeViewController()


        composeVC.recipients = ["Enter tel no"]
        composeVC.body = "Have a look at this cool image!";
        composeVC.messageComposeDelegate = self;

        // Attaching the image to the SMS.

        let image = snapshot
        let imageData = UIImagePNGRepresentation(image)
        composeVC.addAttachmentData(imageData!, typeIdentifier: "image/png", filename:"myImage")



        self.presentViewController(composeVC, animated:true, completion:nil)

        func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult) {
            switch result {
            case MessageComposeResultCancelled:
                NSLog("Cancelled")

            case MessageComposeResultFailed:
                NSLog("Failed")

            case MessageComposeResultSent:
                NSLog("Sent")

            default:
                NSLog("Unknown result")

            }

        }

【问题讨论】:

  • 该警告是因为您没有实现委托的所需方法 - developer.apple.com/library/ios/documentation/MessageUI/…: 但您也没有将视图控制器设置为 MFMessageComposeViewController 的委托。
  • 如果我添加func messageComposeViewController(controller: MFMessageComposeViewController!, didFinishWithResult result: MessageComposeResult) { switch result.value { case MessageComposeResultCancelled.value: NSLog("cancelled") case MessageComposeResultFailed.value: NSLog("cancelled") case MessageComposeResultSent.value: NSLog("cancelled") default: NSLog("default...") } controller.dismissViewControllerAnimated(true, completion: nil) } 是不是实现了所需的方法?
  • 是的,但是如果该函数有错误,那么它将被忽略。修复switch语句中的错误(你不说是什么),函数就会被识别
  • 我已经修改了我的问题,以便更清楚地了解 switch 语句。我想你是正确的。修复 switch 语句,函数可以正常工作,我的代码应该可以正常工作?

标签: ios swift switch-statement sms mfmessagecomposeview


【解决方案1】:

您的问题是您使用的是MFMessageComposeViewController,但您说您的课程是MFMailComposeViewControllerDelegate - Message vs Mail。您已经为 MFMessageComposeViewController 实现了委托方法,该方法与您的类的声明不匹配,因此您收到错误消息。

你想要

class ViewController: UIViewController, MFMessageComposeViewControllerDelegate

然后

func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult) {
    switch result {
    case MessageComposeResultCancelled:
        NSLog("Cancelled")

    case MessageComposeResultFailed:
        NSLog("Failed")

    case MessageComposeResultSent:
        NSLog("Sent")

    default:
        NSLog("Unknown result")

    }

}

另外,您还没有将视图控制器设置为委托,因此不会调用委托方法:

let composeVC = MFMessageComposeViewController()
composeVC.messageComposeDelegate=self

【讨论】:

  • 我已经声明了class ViewController: UIViewController, MFMailComposeViewControllerDelegate, MFMessageComposeViewControllerDelegate ,因为我的应用程序中还有另一个功能可以通过电子邮件发送屏幕截图。
  • 我添加了您修改后的func messageComposeViewController ... 代码,并根据您的说明添加了let composeVC = MFMessageComposeViewController() composeVC.delegate=self。但我现在收到一个错误:Cannot assign value of type 'ViewController' to type 'UINavigationControllerDelegate?' 附加到 composeVC.delegate=self 代码行。
  • 我已将修改后的代码添加到我最初问题的底部。非常感谢所有帮助。
  • 对不起,那个班有两个代表;我已经更新了我的答案
  • 啊。是的,这就是您修改以指定messageComposeDelegate 的原因。明白了。已相应地修改了我的代码,但我仍然留下了 Type 'ViewController' does not conform to protocol 'MFMessageComposeViewControllerDelegate' 错误。
猜你喜欢
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多