Как использовать CNContactPickerViewController для получения адреса и контакта?

Я пытаюсь использовать более современный CNContactPickerViewController для выбора контакта. Если у контакта несколько адресов, я хочу, чтобы пользователь мог выбрать только один из адресов. Если адрес специально выбран, я также хочу получить объект CNContact.

Я мог бы сделать это, используя устаревший ABPeoplePickerNavigationControllerDelegate, где эта функция делегата была доступна:

func peoplePickerNavigationController(_ peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord, property: ABPropertyID, identifier: ABMultiValueIdentifier)

Однако при использовании CNContactPickerViewController доступна только эта соответствующая функция делегата:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty)

Обратите внимание, что объект CNContact не возвращается. Я получаю CNPostalAddress в свойстве контакта, но не получаю запись о контакте-владельце.

Вот код, который я использовал с ABPeoplePickerNavigationController:

    let peoplePicker = ABPeoplePickerNavigationController()

    peoplePicker.peoplePickerDelegate = self

    peoplePicker.displayedProperties = [NSNumber(value: kABPersonAddressProperty as Int32), NSNumber(value: kABPersonBirthdayProperty as Int32)]

    peoplePicker.predicateForSelectionOfPerson = NSPredicate(format: "postalAddresses.@count <= 1")

    peoplePicker.modalPresentationStyle = UIModalPresentationStyle.currentContext

    self.present(peoplePicker, animated: true, completion: nil)

... и вот код с CNContactPickerViewController:

    let contactPicker = CNContactPickerViewController()

    contactPicker.delegate = self

    contactPicker.displayedPropertyKeys = [CNContactPostalAddressesKey, CNContactBirthdayKey]

    contactPicker.predicateForSelectionOfContact = NSPredicate(format: "postalAddresses.@count <= 1")

    contactPicker.modalPresentationStyle = UIModalPresentationStyle.currentContext

    self.present(contactPicker, animated: true, completion: nil)

Итак, мне кажется, что та же функциональность больше не доступна в более новой структуре контактов, но я проверяю здесь, чтобы увидеть, не пропустил ли я что-то.


person Daniel    schedule 22.09.2016    source источник
comment
Моя ошибка заключалась в том, что я искал в CNPostalAddress свойство «контакт». Вместо того, чтобы смотреть на свойство contactProperty.   -  person Daniel    schedule 05.10.2016


Ответы (2)


Обратите внимание, что объект CNContact не возвращается. Я получаю CNPostalAddress в свойстве контакта, но не получаю запись о контакте-владельце.

Объект CNContact можно получить из свойства contact объекта CNContactProperty, поэтому…

Однако при использовании CNContactPickerViewController доступна только эта соответствующая функция делегата:

func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty)

… реализация этого метода делегата позволит вам делать то, что вы хотите. Но вы хотите убедиться, что вы не реализуете другие методы делегата, такие как:

func contactPicker(CNContactPickerViewController, didSelect: CNContact)

который закроет средство выбора в тот момент, когда будет выбран контакт (а не его свойство).

person junjie    schedule 05.10.2016

Обратите внимание, что нет объекта CNContact

Вы просто ошибаетесь в этом. Метод делегата — contactPicker(_:didSelect:), он передает вам CNContactProperty, а CNContactProperty передает вам весь CNContact и все его свойства.

person matt    schedule 05.10.2016