2010-04-23 56 views

回答

26

致电ABAddressBookCopyArrayOfAllPeople()获取地址簿中所有人员记录的数组。然后按照the documentation

要排序的人一个数组,功能ABPersonComparePeopleByName作为比较和类型ABPersonSortOrdering的情况下使用该功能CFArraySortValues。用户希望的排序顺序,由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

如何: - 在ABPerson.h

+0

它是如何将在斯威夫特使用? – Developer 2015-01-02 06:08:10

4

宣布

ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering 

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

苹果的答复的有关部分如下:

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

-Kevin

凯文·埃利奥特,DTS工程师,kevin_elliott @苹果,玉米

+0

请添加一个链接到这个职位以及。 – tipycalFlow 2013-05-29 10:52:50