仅显示右 phone 号码的联系人(联系人框架)
Display only contacts with right phone number (Contacts Framework)
我只想显示具有特定 phone 号码的联系人。 phone 个数字写在一个数组中。我不知道如何只显示这些联系人。因此我尝试使用 "predicateForEnablingContact" 方法。
但是使用我的代码,所有联系人都被禁用,即使是那些号码正确的联系人。我正在使用联系人框架。将不胜感激。
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)
}
此代码 returns 仅在给定集合中具有 phone 号码的联系人:
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 ([=10=].value as! CNPhoneNumber).stringValue }).intersect(numbers).count > 0
}
请注意 numbers
是一个集合。这是为了稍后使用 intersect
方法。 intersect
用于确定联系人是否与给定号码共享任何 phone 号码;如果是,则谓词结果为 true
.
我使用了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()
}
}
它带有默认正则表达式 phone 格式为 ### ### ###, ###-###-###, (###) ### 的数字-####, #-###-###-###, ###-###-###, #########
您也可以从正则表达式资源中获取自己的正则表达式,并在此方法中编辑 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
}
我只想显示具有特定 phone 号码的联系人。 phone 个数字写在一个数组中。我不知道如何只显示这些联系人。因此我尝试使用 "predicateForEnablingContact" 方法。 但是使用我的代码,所有联系人都被禁用,即使是那些号码正确的联系人。我正在使用联系人框架。将不胜感激。
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)
}
此代码 returns 仅在给定集合中具有 phone 号码的联系人:
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 ([=10=].value as! CNPhoneNumber).stringValue }).intersect(numbers).count > 0
}
请注意 numbers
是一个集合。这是为了稍后使用 intersect
方法。 intersect
用于确定联系人是否与给定号码共享任何 phone 号码;如果是,则谓词结果为 true
.
我使用了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()
}
}
它带有默认正则表达式 phone 格式为 ### ### ###, ###-###-###, (###) ### 的数字-####, #-###-###-###, ###-###-###, #########
您也可以从正则表达式资源中获取自己的正则表达式,并在此方法中编辑 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
}