【问题标题】:select multiple properties from single contact in CNContactPicker从 CNContactPicker 中的单个联系人中选择多个属性
【发布时间】:2018-05-11 01:57:19
【问题描述】:

我正在尝试使用 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])

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

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

【问题讨论】:

  • 我认为您需要在CNContactPickerViewController#displayedPropertyKeys 中播种您想要显示的属性,然后选择器才会显示特定联系人的属性表
  • 感谢 MadProgrammer - 我不确定属性键,因为我真的希望它显示联系人中的所有属性。现在,当我不添加委托函数时,它确实会显示整个详细信息卡..我对此无能为力。

标签: ios swift cncontact cncontactviewcontroller cncontactpicker


【解决方案1】:

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

完整版:

CNContactPickerViewController 的实现很差且令人困惑。

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

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

它支持以下:

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

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

我认为选择多个联系人的联系人属性存在一些错误。

解决方法:

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

【讨论】:

  • 感谢 Maddy 的详尽解释。我同意看起来选择器似乎执行不力。我确实发现通过实现contactPicker.predicateForSelectionOfContact = NSPredicate(value: false) 然后使用func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) 我至少可以单击多个属性并将它们添加到我的属性数组中,但是我看不到保持突出显示/下一个复选框的方法到每个属性,因为我无法实际访问详细视图控制器
  • Maddy 就您的解决方法而言...即使我在单击联系人时将其保持在单个联系人选择模式下,它也会立即关闭视图(如果 predicateForSelectionOfContact = NSPredicate(value: true) 或将我带到详细视图如果谓词设置为 false。您知道实际显示 cncontactviewcontroller 的干净方法吗?
  • 我实际上还没有尝试过我建议的可能的解决方法。但我猜你必须在 CNContactPickerViewController 被关闭后显示 CNContactViewController
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2014-04-04
  • 2014-02-07
  • 2021-09-18
  • 2012-02-27
相关资源
最近更新 更多