如何设置NSPredicate以根据数组中的状态排除选择?

时间:2017-08-22 23:20:15

标签: swift nspredicate cncontact

我正在设置一个应用,允许用户从其联系人中选择特定联系人。它的设置(和工作)如下:

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.类的东西),所以我对如何定义谓词非常感兴趣。

0 个答案:

没有答案