我如何按名字和名字排序(或检索已排序的数组)iphone联系簿。姓氏编程?
任何帮助都将受到赞赏......! 感谢
答案 0 :(得分:26)
调用ABAddressBookCopyArrayOfAllPeople()
以获取地址簿中所有人员记录的数组。然后按the documentation:
要对一组人进行排序,请使用函数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);
答案 1 :(得分:7)
这个怎么样: -
ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering
在ABPerson.h
答案 2 :(得分:4)
我使用上面的代码(来自批准的答案)从iPhone复制地址簿,并使用ABPersonComparePeopleByName
对地址簿进行排序。但是当iPhone的国际语言不同时,发现同一个地址簿会有不同的排序结果。假设根据不同的标准对不同的语言进行排序是合理的。所以在我们的项目中我们有“en.lproj”..“zh-hant.lproj”...“ja.lproj”,在NSCalendar
中,我们也有“locale”设置。所以我在考虑如何设置ABPersonComparePeopleByName
的标准并询问Apple。一个非常有用的回复:“排序顺序不可预测”。
Apple的回复相关部分如下:
这实际上是正常行为。使用不同语言进行排序实际上是一个非常复杂的问题,用户的期望因语言/位置而异。老实说,您最好的选择是调整您的期望并假设排序顺序不可预测。任何其他方法都很可能会使许多国际用户感到烦恼和迷惑。
-Kevin
Kevin Elliott,DTS工程师,kevin_elliott @ apple,com