如何使用CNContactStore从CNContainer获取CNGroup数组?

时间:2017-01-30 01:08:39

标签: swift macos cncontactstore

我正在寻找一种获取与联系人容器(CNGroup)相关的组列表(CNContainer)的方法。当我使用predicate时,它失败了。

我使用的代码是

func populateGroups(tableView:NSTableView,container:CNContainer){

    print("populateGroups.start")

    print(container.name)
    print(container.identifier)

    let contactStore = CNContactStore()

    do {
        let groupsPredicate = CNGroup.predicateForGroups(withIdentifiers: [container.identifier])
        groups = try contactStore.groups(matching: groupsPredicate)
        groupNames.removeAll();
        for group:CNGroup in groups {
            self.groupNames.append(group.name)
        }
        tableView.reloadData()
    } catch {
        print( "Unexpected error fetching groups")
    }

    print("populateGroups.finish")

}

我从中获得错误对我没有意义。

line groups = try contactStore.groups(matching:groupsPredicate)导致错误。

[Accounts]无法更新标识为47008233-A663-4A52-8487-9D7505847E29的帐户,错误:错误Domain = ABAddressBookErrorDomain Code = 1002"(null)"

由于我没有更新任何帐户,这令人困惑。

如果我将该行代码更改为groups = try contactStore.groups(matching:nil) 我得到了所有容器的所有组。

如何创建一个谓词,返回属于CNContactContainer的所有CNGroup?

1 个答案:

答案 0 :(得分:1)

我通过使用CNContainer.predicateForContainerOfGroup检查所有组中的每个组属于相关容器来解决这个问题

func populateGroups(tableView:NSTableView,container:CNContainer){

    let contactStore = CNContactStore()

    do {
        let groups:[CNGroup] = try contactStore.groups(matching: nil)
        self.groups.removeAll();
        groupNames.removeAll();
        for group:CNGroup in groups {
            let groupContainerPredicate:NSPredicate = CNContainer.predicateForContainerOfGroup(withIdentifier: group.identifier)
            let groupContainer:[CNContainer] = try contactStore.containers(matching: groupContainerPredicate)
            if( groupContainer[0].identifier == container.identifier) {
                self.groupNames.append(group.name)
                self.groups.append(group)
            }
        }
        tableView.reloadData()

    } catch {
        print( "Unexpected error fetching groups")
    }

}