从联系人发送短信失败

我正在实现一个看似琐碎且非常流行的用例,用户可以选择联系人,并向他们发送预组合的短信。

但是,SMS ViewController会自动解散自身。 这很容易重现。

我该如何解决?

这是我的代码:

import UIKit import MessageUI import ContactsUI class ViewController: UIViewController, MFMessageComposeViewControllerDelegate, CNContactPickerDelegate{ let contactPickerViewController = CNContactPickerViewController() let messageVC = MFMessageComposeViewController() override func viewDidLoad() { super.viewDidLoad() contactPickerViewController.delegate = self messageVC.messageComposeDelegate = self } func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) { if let phoneNumberValue = contact.phoneNumbers.first?.value as? CNPhoneNumber { if let phoneNumber = phoneNumberValue.valueForKey("digits") as? String { // Configure message ViewController messageVC.recipients = [phoneNumber] messageVC.body = "Yoyoyo" picker.presentViewController(messageVC, animated: true, completion: nil) } } } func messageComposeViewController(controller: MFMessageComposeViewController, didFinishWithResult result: MessageComposeResult) { self.dismissViewControllerAnimated(true, completion: nil) } @IBAction func invite(sender: AnyObject) { self.presentViewController(self.contactPickerViewController, animated: true, completion: nil) } } 

问题是您要求您的选择器显示消息视图控制器。 当调用contactPicker:picker:didSelectContact:方法时,系统会自动关闭选择器视图控制器。 这意味着视图控制器正在消失,您正在尝试使用该视图控制器来呈现您的下一个视图控制器。

你需要做的是在这种情况下让“ViewController”呈现消息视图控制器。 下面是我更改的代码部分的示例。 你会注意到我有一个计时器。 这是因为如果您尝试立即呈现messageVC,则不会发生任何事情,因为联系人视图控制器尚未完成解雇。

 func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) { if let phoneNumberValue = contact.phoneNumbers.first?.value as? CNPhoneNumber { if let phoneNumber = phoneNumberValue.valueForKey("digits") as? String { // Configure message ViewController messageVC.recipients = [phoneNumber] messageVC.body = "Yoyoyo" dispatch_async(dispatch_get_main_queue(), { () -> Void in self.presentViewController(self.messageVC, animated: true, completion: nil) }) } } }