OS X的ABAddressBook / ABSource

时间:2014-01-24 16:55:23

标签: macos cocoa abaddressbook

我正在研究Mac的自定义“联系人”实现,我发现我无法从iOS获得ABSource的等效行为。例如,在Mac联系人应用程序中,我可以看到我的iCloud源及其下面的组。当我查询ABAddressBook的组时,我唯一得到的就是“无标题组”(见下文)。所以最终,我问的是如何从我的ABGroup组(无标题组)获取源(iCloud),以便我可以构建类似的UI。似乎Mac中缺少这种功能 - 我希望我只是忽略它。

http://i.stack.imgur.com/RHIll.png

1 个答案:

答案 0 :(得分:0)

你得到的是正确的。

您拥有的唯一一组是“无标题组”。 “所有iCloud”不是ABGroup,而是所有的联系人都设置了组。

如果要复制相同的UI,则可以执行以下操作:

// get your addressbook reference first

// Create mutable dictionary for holding
NSMutableDictionary *sourceDisplayDictionary = [NSMutableDictionary dictionary];
NSArray *sources = (__bridge NSArray *)(ABAddressBookCopyArrayOfAllSources(addressbook));

// Cannot use "ABRecordRef" in fast enumeration
for (id source in sources) {
    ABRecordRef sourceRef = (__bridge ABRecordRef)(source);
    NSString *sourceName = (__bridge NSString *)(ABRecordCopyValue(sourceRef, kABSourceNameProperty));

    // The "All" groups aren't real groups, they're placeholders for ABPersons without a group
    NSString *beginningGroup = [@"All " stringByAppendingString:sourceName];
    NSMutableArray *groupNames = [NSMutableArray arrayWithObject:beginningGroup];
    NSArray *groups = (__bridge NSArray *)(ABAddressBookCopyArrayOfAllGroupsInSource(addressbook, sourceRef));

    // Again, iterate over the array of groups _inside_ the source to build the subarray array
    for (id group in groups) {
        ABRecordRef groupRef = (__bridge ABRecordRef)(group);
        NSString *groupName = (__bridge NSString *)(ABRecordCopyValue(groupRef, kABGroupNameProperty));
        [groupNames addObject:groupName];
    }

    // Add the source name to the dictionary
    sourceDisplayDictionary[sourceName] = [groupNames copy];
}

NSDictionary *sourceDictionary = [sourceDisplayDictionary copy];

/*
 {
   "iCloud":
   [
     "All iCloud",
     "untitled group"
   ]
 }
 */