我想只显示具有特定电话号码的联系人。电话号码以阵列形式写入。我不知道如何仅显示这些联系人。因此我尝试使用" predicateForEnablingContact"方法。 但是使用我的代码,所有联系人都被禁用,即使是具有正确号码的联系人。我正在使用Contacts Framework。非常感谢帮助。
func picker () {
let numbers = ["555","8885555512"]
let pick = CNContactPickerViewController()
pick.displayedPropertyKeys = [CNContactPhoneNumbersKey]
pick.predicateForEnablingContact = NSPredicate(format: "phoneNumbers = %@", argumentArray: numbers)
pick.delegate = self
presentViewController(pick, animated: true, completion: nil)
}
func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]) {
let Kontakte = contacts
print(Kontakte)
dismissViewControllerAnimated(true, completion: nil)
}
答案 0 :(得分:1)
此代码仅返回给定集中具有电话号码的联系人:
let numbers = Set(["555","8885555512"])
let predicate = NSPredicate { (evaluatedObject, bindings) -> Bool in
guard let evaluatedContact = evaluatedObject as? CNContact else { return false }
return Set(evaluatedContact.phoneNumbers.map{ return ($0.value as! CNPhoneNumber).stringValue }).intersect(numbers).count > 0
}
请注意numbers
是一个集合。这是为了稍后使用intersect
方法。 intersect
用于确定联系人是否与给定的号码共享任何电话号码;如果是这样,则谓词结果为true
。
答案 1 :(得分:1)
我使用了KPKContacts包
就像调用这个方法一样简单
var contacts: [KPKContact]()
let contactStore = KPKContactStore()
//make sure you implement the delegate method that will notify contact authorisation changes
contactStore.delegate = self
self.kpkContactStore.findContactsWithValidNumbersOnly(){
kpkContacts in
if let contacts = kpkContacts {
self.contacts = contacts
self.tableView.reloadData()
}
}
它带有默认的正则表达式,格式为### ### ###,### - ### - ###,(###)### - ####, # - ### - ### - ###,### - ### - ###,#########
您也可以从regex资源获取自己的正则表达式,并在此方法中编辑PHONE_REGEX属性
private var regexPhoneNumberValidatorBlock: String -> Bool = { value in
let PHONE_REGEX = "^\\s*(?:\\+?(\\d{1,3}))?[-. (]*(\\d{3})[-. )]*(\\d{3})[-. ]*(\\d{4})(?: *x(\\d+))?\\s*$"
let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX)
let result = phoneTest.evaluateWithObject(value)
return result
}