我正在实施一个看似琐碎且非常受欢迎的用例,用户可以选择联系人,并向他们发送预先组合的短信。
但是,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)
}
}
答案 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)
})
}
}
}