【发布时间】: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