如何对iPhone通讯录进行排序?

14

我如何通过程序按照名字和姓氏对iPhone通讯录进行排序(或检索已排序的数组)?

非常感谢您的任何帮助...!谢谢

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);

7
这样怎么样:--
ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering

ABPerson.h 中声明


它将如何在Swift中使用? - Developer

4
我正在使用上述代码(来自批准的答案)从iPhone复制通讯录,并使用ABPersonComparePeopleByName对通讯录进行排序。但是,当iPhone的国际语言不同时,相同的通讯录将具有不同的排序结果。根据不同的语言以不同的标准进行排序是合理的。因此,在我们的项目中,我们有“en.lproj”..“zh-hant.lproj”..。“ja.lproj”,在NSCalendar中,我们还有“locale”设置。所以我在思考如何为ABPersonComparePeopleByName设置标准,并向Apple提问。非常有帮助的回复:“排序顺序是不可预测的”。
以下是苹果回复的相关部分:
这其实是正常行为。在不同的语言中进行排序实际上是一个非常复杂的问题,用户的期望因语言/位置而异。老实说,您最好的选择是调整您的期望并假设排序顺序是不可预测的。任何其他方法都很可能会使许多国际用户感到恼火和困惑。
-Kevin
Kevin Elliott,DTS工程师,kevin_elliott@apple,com

请翻译下列有关编程的内容,从英语到中文。只返回翻译后的文本:请在此帖子中添加链接。Link: [insert link here]注意:翻译时请确保专业、流畅、优美,但不要使用机器翻译风格。 - tipycalFlow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接