Ios 从联系人发送短信失败

Ios 从联系人发送短信失败,ios,swift,Ios,Swift,我正在实现一个看似琐碎且非常流行的用例,其中用户选择一个联系人,并向他们发送一条预合成的短信 但是,SMS ViewController会自动解除其自身功能。这很容易复制 我该如何解决这个问题 这是我的密码: import UIKit import MessageUI import ContactsUI class ViewController: UIViewController, MFMessageComposeViewControllerDelegate, CNContactPickerD

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

但是,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:method时,系统将自动解除picker view控制器。这意味着视图控制器将消失,而您正试图使用该视图控制器来显示下一个视图控制器

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

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)
            })
        }
    }
}

真棒,克里斯,这很管用。我仍然很想知道是否有一个不那么黑客的解决方案(我想我们都同意定时器是一种黑客)。如果系统解除了
didSelectContact
,为什么解除的是
messageVC
,而仍然是
contactPicker
contactPicker
是否也应该被解除?系统可能正在调用dismissViewController:这应该是选择器,但您可能以足够快的速度呈现消息vc,以至于在调用dismise时,它实际上是在消息vc上被调用的。这是我的猜测。我同意计时器确实有点不正常,但因为解雇是由系统而不是我们来调用的,所以我们无法访问完成块。Def除了计时器还有其他选择。是的,这很有意义。我会等一等,明天再接受,如果没有人提出正式解决方案,你可以从使用
NSTimer
切换到使用Grand Central Dispatch。明显的优点是,您不必定义单独的方法(
presentMessageVC()
,在本例中),而可以将该逻辑包装在一个块(闭包)中,并将所有内容都很好地包含在
-contactPicker:didSelectContact:
的主体中。(我是GCD的忠实粉丝,可能从2010年开始就没有使用过
NSTimer