如何使用CNContactPickerViewController获取地址和联系?

时间:2016-09-22 00:14:54

标签: ios swift contacts-framework

我正在尝试使用更现代的CNContactPickerViewController来选择联系人。如果联系人有多个地址,我希望用户只能选择其中一个地址。如果专门选择了一个地址,我也想获得CNContact对象。

我可以使用已弃用的ABPeoplePickerNavigationControllerDelegate来执行此操作,其中此委托功能可用:

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

但是,使用CNContactPickerViewController时,只有相关的委托功能可用:

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

请注意,没有返回CNContact个对象。我在contactProperty中获得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)

所以,对我而言,新的联系人框架中似乎不再提供相同的功能,但我在这里查看是否遗漏了某些内容。

2 个答案:

答案 0 :(得分:3)

  

请注意,没有返回CNContact个对象。我明白了   在contactProperty中CNPostalAddress,但我没有收到   拥有联系人的记录。

可以从CNContact的{​​{1}}属性中检索contact对象,因此......

  

但是,使用CNContactProperty时,只有这个   相关代表职能可用:

CNContactPickerViewController

...实现这种委托方法可以让你做你想做的事。但是你想确保你实现其他委托方法,例如:

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

将在选择联系人(而非其财产)时解除选择器。

答案 1 :(得分:1)

  

请注意,没有CNContact对象

你错了。委托方法为show(),它为您提供CNContactProperty,CNContactProperty为您提供整个CNContact及其所有属性。