我正在寻找一种获取与联系人容器(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?
答案 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")
}
}