【问题标题】:Search Contacts via group using CNContact使用 CNContact 通过群组搜索联系人
【发布时间】:2015-10-07 15:58:27
【问题描述】:

使用 Swift2,我正在尝试查找属于“工作”组成员的所有联系人,然后返回这些联系人。

创建谓词之后。

let workPred = CNContact.predicateForContactsInGroupWithIdentifier("Work")
let keysToFetch = [CNContactGivenNameKey]
let results = contacts.unifiedContactsMatchingPredicate(workPred, keysToFetch)

但是当有group id的联系人时它总是返回0个结果。

【问题讨论】:

    标签: iphone swift2 ios9


    【解决方案1】:

    "Work" 不是组标识符。您必须通过CNContactStoregroupsMatchingPredicate 获取组:

    • func groupsMatchingPredicate(_ predicate: NSPredicate?) throws -> [CNGroup]

    然后你会得到一个CNGroup 对象的数组。每个CNGroup 都有两个属性:

    • name
    • identifier

    所以CNGroup.identifier 是您要在谓词中使用的内容。 CNGroup 对象的示例:

    [
      <CNGroup: 0x7fe563ca91f0: identifier=2DFE28EB-A9CA-4920-A77D-46BEE5A09E96, name=Friends>,
      <CNGroup: 0x7fe563ca3bc0: identifier=E007B6DD-F456-48FA-A564-32256A898B67, name=Work>
    ]
    

    这里可以看到生成的标识符是UUID。不是组名。

    这是一个例子:

    do {
      let store = CNContactStore()
    
      let groups = try store.groupsMatchingPredicate(nil)
      let filteredGroups = groups.filter { $0.name == "Work" }
    
      guard let workGroup = filteredGroups.first else {
        print("No Work group")
        return
      }
    
      let predicate = CNContact.predicateForContactsInGroupWithIdentifier(workGroup.identifier)
      let keysToFetch = [CNContactGivenNameKey]
      let contacts = try store.unifiedContactsMatchingPredicate(predicate, keysToFetch: keysToFetch)
    
      print(contacts)
    }
    catch {
      print("Handle error")
    }
    

    没有找到任何合适的谓词(CNGroup)直接匹配组名。

    【讨论】:

    • hi @robertvojta 如何像您的示例 CNGroup 一样获取 CNGroup 的列表?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    相关资源
    最近更新 更多