地址簿联系人排序

2024-02-01

我有下面的代码,我设法从地址簿中列出了姓名和电话号码,但如何按名字对其进行排序?

ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
abContactArray = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBookRef); // get address book contact array

NSInteger totalContacts =[abContactArray count];

for(NSUInteger loop= 0 ; loop < totalContacts; loop++)
{
    ABRecordRef record = (__bridge ABRecordRef)[abContactArray objectAtIndex:loop]; // get address book record

    if(ABRecordGetRecordType(record) ==  kABPersonType) // this check execute if it is person group
    {
        //ABRecordID recordId = ABRecordGetRecordID(record); // get record id from address book record

        //NSString *recordIdString = [NSString stringWithFormat:@"%d",recordId]; // get record id string from record id
        //NSLog(@"Record: %@", recordIdString);

        NSString *firstNameString = (__bridge NSString*)ABRecordCopyValue(record,kABPersonFirstNameProperty); // fetch contact first name from address book

        NSString *lastNameString = (__bridge NSString*)ABRecordCopyValue(record,kABPersonLastNameProperty); // fetch contact last name from address book
                                                                                                            //NSString *contactEmail = (__bridge NSString*)ABRecordCopyValue(record,kABPersonEmailProperty); // fetch contact last name from address book

        NSString * fullName = [NSString stringWithFormat:@"%@ %@", firstNameString, lastNameString];

        [name addObject: fullName];

        ABMultiValueRef phoneNumberMultiValue = ABRecordCopyValue(record, kABPersonPhoneProperty);
        NSUInteger phoneNumberIndex;
        for (phoneNumberIndex = 0; phoneNumberIndex < ABMultiValueGetCount(phoneNumberMultiValue); phoneNumberIndex++) {

            CFStringRef labelStingRef = ABMultiValueCopyLabelAtIndex (phoneNumberMultiValue, phoneNumberIndex);

            //NSString *phoneLabelLocalized = (__bridge NSString*)ABAddressBookCopyLocalizedLabel(labelStingRef);

            phoneNumber  = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phoneNumberMultiValue, phoneNumberIndex);

            CFRelease(labelStingRef);

            //NSLog(@"Name: %@ %@: %@ | %@", firstNameString, lastNameString, phoneNumber, emailAddresses);

        }
        [phone addObject: phoneNumber];


    }
}

我尝试输入这些代码:

ABRecordRef record = (__bridge ABRecordRef)[abContactArray objectAtIndex:loop]; // get address book record

//ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBookRef);
CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(
                                                           kCFAllocatorDefault,
                                                           CFArrayGetCount(people),
                                                           people
                                                           );


CFArraySortValues(
                  peopleMutable,
                  CFRangeMake(0, CFArrayGetCount(peopleMutable)),
                  (CFComparatorFunction) ABPersonComparePeopleByName,
                  (void*) ABPersonGetSortOrdering()
                  );

//NSMutableArray *data = [(__bridge NSArray *) peopleMutable mutableCopy];
NSMutableArray* data = [NSMutableArray arrayWithArray: (__bridge NSArray*) peopleMutable];

NSLog(@"sort: %@", data);

但 nslog 给了我这些输出:

sort: (
"<CPRecord: 0xaa5d250 ABPerson>",
"<CPRecord: 0xaa6e050 ABPerson>",
"<CPRecord: 0xaa3d7d0 ABPerson>",
"<CPRecord: 0xaa515d0 ABPerson>",
"<CPRecord: 0xaa43b90 ABPerson>",
"<CPRecord: 0xaa6b780 ABPerson>"
)

您可以使用以下方法按名称对条目进行排序:

CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault,
                                                           CFArrayGetCount(people),
                                                           people);

CFArraySortValues(peopleMutable,
                  CFRangeMake(0, CFArrayGetCount(peopleMutable)),
                  (CFComparatorFunction) ABPersonComparePeopleByName,
                  kABPersonSortByFirstName);

// or to sort by the address book's choosen sorting technique
//
// CFArraySortValues(peopleMutable,
//                   CFRangeMake(0, CFArrayGetCount(peopleMutable)),
//                   (CFComparatorFunction) ABPersonComparePeopleByName,
//                   (void*) ABPersonGetSortOrdering());

CFRelease(people);

// If you don't want to have to go through this ABRecordCopyValue logic
// in the rest of your app, rather than iterating through doing NSLog,
// build a new array as you iterate through the records.

for (CFIndex i = 0; i < CFArrayGetCount(peopleMutable); i++)
{
    ABRecordRef record = CFArrayGetValueAtIndex(peopleMutable, i);
    NSString *firstName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonFirstNameProperty));
    NSString *lastName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonLastNameProperty));
    NSLog(@"person = %@, %@", lastName, firstName);
}

CFRelease(peopleMutable);

或者你可以使用这种技术:

NSArray *originalArray = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
abContactArray = [originalArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    ABRecordRef record1 = (__bridge ABRecordRef)obj1; // get address book record
    NSString *firstName1 = CFBridgingRelease(ABRecordCopyValue(record1, kABPersonFirstNameProperty));
    NSString *lastName1 = CFBridgingRelease(ABRecordCopyValue(record1, kABPersonLastNameProperty));

    ABRecordRef record2 = (__bridge ABRecordRef)obj2; // get address book record
    NSString *firstName2 = CFBridgingRelease(ABRecordCopyValue(record2, kABPersonFirstNameProperty));
    NSString *lastName2 = CFBridgingRelease(ABRecordCopyValue(record2, kABPersonLastNameProperty));

    NSComparisonResult result = [firstName1 compare:firstName2];
    if (result != NSOrderedSame)
        return result;
    else
        return [lastName1 compare:lastName2];
}];

for (id object in abContactArray)
{
    ABRecordRef record = (__bridge ABRecordRef)object; // get address book record
    NSString *firstName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonFirstNameProperty));
    NSString *lastName = CFBridgingRelease(ABRecordCopyValue(record, kABPersonLastNameProperty));
    NSLog(@"person = %@, %@", lastName, firstName);
}

前者看起来更干净,但只是另一种选择,以防万一你想避免CFRelease在 ARC 世界中。

顺便说一下,使用ABAddressBookRequestAccessWithCompletion在 iOS 6 中检查以确保您有权访问地址簿(通过条件检查以确保它仍然适用于早期版本的 iOS)。即使您使用的是早期版本的 iOS,您也应该手动请求用户获得许可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

地址簿联系人排序 的相关文章

随机推荐

  • 如何消除条形图中条形之间的间隙

    我正在 Matplotlib 中通过如下调用制作条形图 xs bar bar lefts bar heights facecolor black edgecolor black 我得到一个如下所示的条形图 我想要的是连续条之间没有白色间隙的
  • 当我按回车键或在文本字段外部单击时,如何删除文本字段焦点? (SwiftUI、MacOS)

    当我按回车键或在文本字段外部单击时 如何删除文本字段焦点 请注意 这是 SwiftUIMacOS 如果我这样做 import SwiftUI struct ContentView View State var field1 String T
  • Hive:选择 AS 和分组依据

    我有一个 Hive 查询 例如 SELECT Year Month Day Hours Minutes cast cast Seconds as int 15 as int 15 AS secondMod Count AS PerCount
  • XMLHttpRequest 返回错误编码的字符

    我使用 XMLHttpRequest 来读取 PDF 文档http www virtualmechanics com support tutorials spinner Simple2 pdf http www virtualmechani
  • 无法执行目标 org.apache.maven.plugins:maven-clean-plugin:2.4.1

    我正在做一个maven项目 我的IDE是Eclipse 我无法掌握的是当我在Eclipse中使用 clean X 时 它会报告以下错误 Apache Maven 3 0 4 r1232337 2012 01 17 16 44 56 0800
  • 将 Emacs AUCTeX 与 Sumatra PDF 同步

    有了我的这些行init el我能够将 Emacs LaTeX 缓冲区与 Sumatra 同步 setq TeX source correlate mode t setq TeX source correlate method synctex
  • 为什么我会出现 Keras 形状不匹配的情况?

    我正在遵循一个针对初学者的 Keras mnist 示例 我尝试更改标签以适合我自己的数据 该数据有 3 个不同的文本分类 我正在使用 to categorical 来实现这一点 形状对我来说看起来不错 但 fit 会出现错误 train
  • 查找数组中长度为 k 的所有子集

    给定一组 1 2 3 4 5 n 对于 n 个元素 我们需要找到长度为 k 的所有子集 例如 如果 n 4 且 k 2 则output将会 1 2 1 3 1 4 2 3 2 4 3 4 我什至不知道如何开始 我们不必使用内置的库函数 如
  • 你怎么会忘记 Laravel 中缓存的 Eloquent 模型呢?

    关于 Laravel 的理论问题在这里 所以我要做的缓存示例是 Article with comments gt remember 5 gt get 理想情况下 我希望有一个文章更新事件 当该模型的实例 已缓存 的 ID 更新时 我想忘记该
  • 存在哪些 ASP.NET MVC 示例项目? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 混合语言框架

    我有一个用 Objective C 编写的框架 我们称之为 MyKit 我用一些 Swift 类对其进行了扩展 我正在尝试使用以下文档来理解它 https developer apple com library ios documentat
  • OpenGL ES 片段着色器可以更改片段的深度值吗?

    OpenGL ES 2 0 中的片段着色器可以更改像素的 Z 值 深度 吗 在 OpenGL ES 2 0 中这是如何实现的 No gl FragDepth 这是 GLSL 桌面版本的一部分 在 OpenGL ES 中不存在 但是 您可以检
  • NHibernate 将类属性映射到行而不是列

    是否可以映射一个类 其中每个属性存储为表中的行而不是列 该场景是我们将全局选项保存到数据库的情况 我们将选项存储在 选项 类中 每个选项都有一个属性 即 展开菜单 退出时保存 等 我们不想将每个选项存储在其自己的表列中 而是希望有一个表 其
  • 如何获取包含占位符的属性的原始值?

    我试图在我的 properties 文件之一中定义以下属性 personExpression person surname 然后由配置类读取 Configuration public class TemplateConfig Autowir
  • 在 Chrome 扩展程序中获取 JSON

    我的 chrome 扩展有一个小问题 我只是想从另一台服务器获取 JSON 数组 但清单 2 不允许我这样做 我尝试指定content security policy 但 JSON 数组存储在没有 SSL 证书的服务器上 那么 如果不使用清
  • 更改 varchar 列的最大长度?

    我正在尝试将 varchar 列的长度从 255 个字符更新为 500 个字符 而不会丢失内容 我之前已经删除并重新创建过表 但我从未接触过 alter 语句 我相信我需要使用它来执行此操作 我在这里找到了文档 更改表 Transact S
  • Python——使用 Selenium 打开多个选项卡

    我正在使用Python 我正在尝试在 Chrome 上打开两个选项卡 每个选项卡都指向不同的网站 这是我的代码 from selenium import webdriver from selenium webdriver common ke
  • 将视频添加到 YouTube 上用户最喜欢/喜欢的播放列表

    目的是使用 YouTube API 创建一个收藏 喜欢按钮 当用户单击该按钮时 视频将保存到用户的 收藏 喜欢 播放列表中 就像您在自己的网站上实施 Facebook Like 按钮时的工作原理一样 这本质上是对发布的出色解决方案的后续问题
  • 在 google oauth 后,如何在不使用 webview 的情况下将用户重定向回我的应用程序?

    谷歌决定禁止通过 webview 进行 oauth 给我带来了巨大的麻烦 迁移到替代方案是一个漫长而困难的过程 我目前正在使用建议的 AppAuth 库 并且我收到用户抱怨 如果不将帐户添加到 chrome 他们的设备 这作为据我所知 如果
  • 地址簿联系人排序

    我有下面的代码 我设法从地址簿中列出了姓名和电话号码 但如何按名字对其进行排序 ABAddressBookRef addressBookRef ABAddressBookCreateWithOptions NULL NULL abConta