【问题标题】:Display only contacts with right phone number (Contacts Framework)仅显示具有正确电话号码的联系人(联系人框架)
【发布时间】:2016-01-08 11:09:14
【问题描述】:

我只想显示那些具有特定电话号码的联系人。电话号码写在一个数组中。我不知道如何只显示这些联系人。因此我尝试使用“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)
}

【问题讨论】:

  • phoneNumbers 不是数字数组,因此它永远不会匹配您的 numbers 数组。您需要考虑“使用特定电话号码”对您的真正意义。
  • 我想制作一个聊天应用程序并只显示使用该应用程序的联系人。我想我可以通过从解析下载用户号码并使用这个号码来搜索联系人来做到这一点。但是,如果我在解析时搜索联系人电话号码,然后下载名称(如果存在)然后使用带有名称的谓词,它应该可以工作还是这也是错误的?
  • "仅显示使用该应用程序的联系人" 联系人的标识符是其identifier
  • 这是我的回答,希望对您有所帮助stackoverflow.com/questions/37481483/…>

标签: ios swift swift2 contacts


【解决方案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

【讨论】:

  • @FredA。对于大多数联系人框架来说,这是正确的,但是如果您查看 CNContactPickerViewController 文档,它并没有说您不能。
  • 你试过了吗?因为我有,但它不起作用......此外,文档说:“请注意,Contacts 框架不支持通用和复合谓词”
  • @FredA。我在我的应用程序中使用了一个类似的实现,它根据联系人 ID 号码进行排除,并且效果很好。如果您想尝试一下,它被称为 Contact Archiver。按选择联系人,选择几个,然后再次按选择,选择器中的联系人将被禁用。
  • 谓词正确但NSBlockPredicate不能与predicateForEnablingContactCNContactPickerViewController上使用。
【解决方案2】:

我使用了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_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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 2012-03-14
    • 2017-11-26
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多