14

如何以编程方式按名字和姓氏对 iphone 通讯录进行排序(或检索排序数组)?

任何帮助将不胜感激......!谢谢

4

3 回答 3

26

调用ABAddressBookCopyArrayOfAllPeople()以获取地址簿中所有人员记录的数组。然后按照文档

要对人员数组进行排序,请使用函数 CFArraySortValues 和函数 ABPersonComparePeopleByName 作为比较器,并使用 ABPersonSortOrdering 类型的上下文。ABPersonGetSortOrdering 返回的用户所需的排序顺序通常是首选上下文。

以下代码清单显示了对整个通讯簿数据库进行排序的示例:

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(
                                          kCFAllocatorDefault,
                                          CFArrayGetCount(people),
                                          people
                                  );

 CFArraySortValues(
        peopleMutable,
        CFRangeMake(0, CFArrayGetCount(peopleMutable)),
        (CFComparatorFunction) ABPersonComparePeopleByName,
        (void*) ABPersonGetSortOrdering()
); 

CFRelease(addressBook);
CFRelease(people);
CFRelease(peopleMutable);
于 2010-04-23T10:58:20.787 回答
7

这个怎么样: -

ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering

宣布于ABPerson.h

于 2010-08-05T22:21:16.603 回答
4

我正在使用上面的代码(来自批准的答案)从 iPhone 复制地址簿,也用于ABPersonComparePeopleByName对地址簿进行排序。但是发现当iPhone的国际语言不同时,同一个通讯录会有不同的排序结果。假设根据不同的标准对不同的语言进行排序是合理的。所以在我们的项目中,我们有“en.lproj”..“zh-hant.lproj”...“ja.lproj”,在NSCalendar我们还有“locale”设置。所以我在想如何设置标准ABPersonComparePeopleByName,问苹果。一个非常有帮助的回复:“排序顺序是不可预测的”。

苹果回复的相关部分如下:

这实际上是正常行为。以不同的语言进行排序实际上是一个非常复杂的问题,用户的期望因语言/位置而异。老实说,您最好的选择是调整您的期望并假设排序顺序是不可预测的。任何其他方法很可能会惹恼和混淆许多国际用户。

-凯文

Kevin Elliott,DTS 工程师,kevin_elliott@apple,com

于 2012-10-20T02:32:56.047 回答