CNContactPickerViewController - Невозможно сделать выбор
Я использую CNContactPickerViewController
чтобы позволить пользователю видеть свой список контактов и выбрать контакт. Однако, хотя я могу показать им их список контактов, нет возможности выбрать какие-либо контакты. Я только ищу их, чтобы выбрать один контакт. В списке имен нет селектора для касания, и если вы нажмете на человека, вы получите его карточку контакта. На этом экране нет ничего, что позволяло бы им выбирать контакт. Итак, нет, я могу показать им их контакты, но они не могут никого выбрать. Я пробовал это как на симуляторе, так и на реальном устройстве.
Ниже приведен класс, который я создал для обработки того, что должно быть простым процессом:
import Foundation
import ContactsUI
class ContactsController: NSObject, CNContactPickerDelegate {
private var parentController:UIViewController!
init(parentController:UIViewController) {
super.init()
self.parentController = parentController
openContactList()
}
private func openContactList() {
let picker = CNContactPickerViewController()
picker.delegate = self
picker.displayedPropertyKeys = [CNContactPhoneNumbersKey]
self.parentController.present(picker, animated: true)
}
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
print("\(contact.givenName) \(contact.familyName): \(contact.phoneNumbers.first)")
}
}
В качестве обновления я реализовал:
func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
print("Canceled")
}
Этот метод никогда не вызывается. Я предполагаю, что с делегатом что-то не так. Кстати, я переместил создание экземпляров ниже на уровень класса на случай, если он выходит из области видимости. Это не помогло:
let picker = CNContactPickerViewController ()
2 ответа
Проблема заключалась в том, что мой делегат выходил за рамки. Проблема была не в классе, который я разместил в своем ОП. Я звонил в этот класс из IBAction
в UITableViewCell
который выходил из области видимости, таким образом, этот класс был потерян. Держа мой ContactsController
переменная на уровне класса из вызывающего класса, решает эту проблему.
Это весь мой код: -
import UIKit
import Contacts
import ContactsUI
class ViewController: UIViewController, CNContactPickerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func buttonTapped(_ sender: Any) {
let peoplePicker = CNContactPickerViewController()
peoplePicker.delegate = self
self.present(peoplePicker, animated: true, completion: nil)
}
func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
contacts.forEach { contact in
print(contact.givenName, contact.familyName)
}
}
func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
//your code
}