2010-04-23 64 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