从联系人发送短信失败

时间:2016-01-12 19:44:15

标签: ios swift

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

但是,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)

    }
}

1 个答案:

答案 0 :(得分:3)

问题是您要求您的选择器显示消息视图控制器。当调用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)
            })
        }
    }
}