如何在iOS 7.1中对联系人进行排序

如何在iOS 7.1中对联系人进行排序,ios,64-bit,abaddressbook,ios7.1,Ios,64 Bit,Abaddressbook,Ios7.1,在对Xcode 5.1进行最后一次更新后,苹果公司的地址簿排序示例代码停止工作。网址: 示例代码 ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(

在对Xcode 5.1进行最后一次更新后,苹果公司的地址簿排序示例代码停止工作。网址:

示例代码

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);
但现在,这段代码引发了一个警告

从较小的整数类型“ABPersonSortOrdering”(又名“unsigned int”)转换为“void*”

在这一行

(void*) ABPersonGetSortOrdering())
我应该如何修改此代码

事实上,我查看了苹果的论坛,在谷歌上搜索了一下,然后满溢出来,但还没有找到乐趣

希望你能帮助我

更新


它使用64位与此警告有关。这和我的新iPhone5S的加入不谋而合。

我怀疑你们的问题在于64位和32位架构之间的差异,Xcode 5.1默认启用了64位支持。如果指针为64位,整数为32位,则整数太小,无法容纳指针值

您可以通过进入“目标”>“生成设置”禁用应用程序的64位编译,但我强烈建议您不要这样做。此外,以下代码对我有效,它还实现了新的创建方法,并正确地实现了授权检查(这确保用户已授予您的应用访问联系人的权限)

虽然如果我真的想挑三拣四的话,我会说你应该把
数组放到一个NSArray中,如下所示:

NSArray *people = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

然后考虑使用<代码> NSRoStRead Stults实现排序方法,因为它们可能会更快,当然也是一种更现代的做事方式。

正如你所陈述的,问题在于新的64位架构。code>(void*)是32位体系结构的32位指针,但对于64位体系结构是64位指针。函数

ABPersonGetSortOrdering()
返回类型为
ABPersonCompositeNameFormat
的值,该值在ABPerson.h中指定为
uint32\t
。因此,警告让您知道64位指针指向32位数字

可以通过将返回值键入
无符号long
来消除警告。这是完美的,因为它在64位体系结构上是64位的,在32位体系结构上是32位的

(void *)(unsigned long)ABPersonGetSortOrdering()

希望这有帮助

我复制了您的代码,没有收到您提到的警告,但是我应该指出您的创建方法已被弃用,您应该使用
ABAddressBookCreate
而不是
ABAddressBookCreateWithOptions()
。您还应该事先使用
ABAddressBookRequestAccessWithCompletion
检查您是否有权访问通讯簿。请参阅此处了解更多详细信息。。。谢谢你提到我的反对意见,不过我粘贴在这里的代码是从苹果的文档中提取出来的。在我的代码中,我使用<代码> AbabdReSooCoCudio>选项>代码>来创建地址簿。老实说,我很惊讶API没有为基础做重做。肯定是时候了。感谢您在64位上的输入。您发布的代码与我发布的代码没有什么不同,而且在
abPersonCompareOpleByName
上也有相同的警告。它确实不同,它使用了
ABAddressBookRef
的非弃用构造函数,并确保用户事先授予了联系人访问权限,如果用户拒绝访问,则会导致当前应用程序崩溃。此外,正如我所说的,在我的xcode版本中没有针对您所说的行的警告。那么
(void*)(NSUInteger)ABPersonGetSortOrdering()
呢。我认为它可以在每个32位和64位编译环境中工作。
(void *)(unsigned long)ABPersonGetSortOrdering()