如何以编程方式按名字和姓氏对 iphone 通讯录进行排序(或检索排序数组)?
任何帮助将不胜感激......!谢谢
调用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);
这个怎么样: -
ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
宣布于ABPerson.h
我正在使用上面的代码(来自批准的答案)从 iPhone 复制地址簿,也用于ABPersonComparePeopleByName
对地址簿进行排序。但是发现当iPhone的国际语言不同时,同一个通讯录会有不同的排序结果。假设根据不同的标准对不同的语言进行排序是合理的。所以在我们的项目中,我们有“en.lproj”..“zh-hant.lproj”...“ja.lproj”,在NSCalendar
我们还有“locale”设置。所以我在想如何设置标准ABPersonComparePeopleByName
,问苹果。一个非常有帮助的回复:“排序顺序是不可预测的”。
苹果回复的相关部分如下:
这实际上是正常行为。以不同的语言进行排序实际上是一个非常复杂的问题,用户的期望因语言/位置而异。老实说,您最好的选择是调整您的期望并假设排序顺序是不可预测的。任何其他方法很可能会惹恼和混淆许多国际用户。
-凯文
Kevin Elliott,DTS 工程师,kevin_elliott@apple,com