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