0

我正在尝试使用 CNContactPickerViewController 并不断遇到如何从单个联系人中选择多个属性的问题

拾取器的基本显示

    let contactStore = CNContactStore()

override func viewDidLoad() {
    super.viewDidLoad()

    self.askForContactAccess()
    self.displayContacts()
}

func displayContacts(){
    let contactPicker = CNContactPickerViewController()
    contactPicker.delegate = self
    self.present(contactPicker, animated: true, completion: nil)
}

这将在用户授予权限后显示地址簿(代码在那里但没有在上面显示)

现在我想做的是当用户选择一个联系人时,我们导航到联系人详细信息视图(目前发生这种情况)但是当我尝试使用委托时

func contactPicker(_ picker: CNContactPickerViewController, didSelectContactProperties contactProperties: [CNContactProperty])

我会看到联系人选择器视图,我可以在其中选择多个联系人。我不介意尝试扩展联系人详细信息视图,以便我可以选择多个属性,但我什至不知道如何挂钩。

我可以创建一个完全自定义的表格视图并在那里选择属性,但由于苹果创建了一个很好的联系人详细信息视图,我宁愿使用它。

4

1 回答 1

1

tl;dr - 不,您不能使用CNContactPickerViewController从一个联系人中选择多个属性。

完整版本:

CNContactPickerViewController实施得很差且令人困惑。

事实上,它实际上并不支持从单个联系人中选择多个属性的能力。选择单个联系人属性后,选择器会自动关闭。

它实际上并没有让用户从多个联系人中选择特定的属性。

它支持以下内容:

  • 选择单个联系人
  • 选择单个联系人的单个属性
  • 选择多个联系人
  • 选择多个联系人并从每个用户选择的多个联系人返回一个预定的(不是用户选择的)属性。

didSelectContactProperties使用空属性列表以外的任何内容调用委托,您必须将该predicateForSelectionOfProperty属性设置为一个谓词,该谓词指定一个且仅一个联系人属性键。如果您提供任何其他谓词,当您点击联系人时会出现黑屏,并且您的应用程序现在已挂起并需要终止。

我相信有几个与选择多个联系人的联系人属性相关的错误。

解决方法:

我相信唯一的解决方案(除了您自己围绕联系人框架的完整自定义视图控制器)将通过在单个联系人选择模式中组合来进行自己的多个属性选择CNContactPickerViewController,然后使用CNContactViewController显示所选联系人的详细信息。然后实现contactViewController(_:shouldPerformDefaultActionFor:)委托方法来跟踪用户选择的属性。

于 2018-05-11T04:18:45.707 回答