我正在设置一个应用,允许用户从其联系人中选择特定联系人。它的设置(和工作)如下:
let contactStore = CNContactStore()
var contactArray = [CNContact]()
func selectContact(){ //This is called upon the tapping of a UIButton
let contactPicker = CNContactPickerViewController()
contactPicker.displayedPropertyKeys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey, CNContactImageDataKey]
contactPicker.delegate = self
contactPicker.predicateForEnablingContact = NSPredicate(format: "phoneNumbers.@count >= 0")
contactPicker.predicateForSelectionOfContact = NSPredicate(format: "phoneNumbers.@count >= 1")
self.present(contactPicker, animated: true, completion: nil)
}
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
contactArray.append(contact)
print(contactArray)
contactsTableView.reloadData()
dismiss(animated: true)
}
func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) {
contactArray.append(contactProperty.contact)
print(contactArray)
contactsTableView.reloadData()
dismiss(animated: true)
}
现在,再次,就像我说代码工作正常。但是,在用户选择联系人后,将其添加到contactArray
我希望在下次按下按钮时打开contactPicker
时,该联系人不再可以选择。我知道我需要做什么(修改contactPicker.predicateForSelectionOfContact
),但我不知道如何来实现我想要的结果。我一直关注the ContactUI framework tutorial,他们通过制作谓词NSPredicate(format: "(phoneNumbers.@count >= 1) AND NOT (identifier IN $@), self.buddies.map{ $0.identifier }")
来达到预期的效果。但是,在他们的示例中,buddies
不是我的数组的CNContacts
数组,因此将此代码直接传输到我的代码不起作用并产生错误。我并不真正理解谓词(绝对不是$0.
类的东西),所以我对如何定义谓词非常感兴趣。