1

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

我可以使用 deprecated 来做到这一点ABPeoplePickerNavigationControllerDelegate,该委托功能可用:

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

但是,当使用 时CNContactPickerViewController,只有这个相关的委托函数可用:

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

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

这是我使用的代码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)

所以,对我来说,在较新的 Contacts Framework 中似乎不再提供相同的功能,但我在这里查看是否遗漏了什么。

4

2 回答 2

3

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

CNContact对象可以从 的contact属性中检索CNContactProperty,所以……</p>

但是,当使用 时CNContactPickerViewController,只有这个相关的委托函数可用:

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

…实现这个委托方法可以让你做你想做的事。但是您要确保您没有实现其他委托方法,例如:

func contactPicker(CNContactPickerViewController, didSelect: CNContact)

这将在选择联系人(而不是其属性)时关闭选择器。

于 2016-10-05T02:21:04.103 回答
1

请注意,没有 CNContact 对象

你错了。委托方法是contactPicker(_:didSelect:),它给你一个 CNContactProperty,而 CNContactProperty 给你整个 CNContact 及其所有属性。

于 2016-10-05T02:25:25.100 回答