仅显示具有正确电话号码的联系人(联系人框架)

时间:2015-10-10 16:31:18

标签: ios swift swift2 contacts

我想只显示具有特定电话号码的联系人。电话号码以阵列形式写入。我不知道如何仅显示这些联系人。因此我尝试使用" 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)
}

2 个答案:

答案 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
}