1

我正在尝试为存储在我的 iPhone 中的联系人设置图像。我使用了以下代码片段 - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

UIImage *image = [UIImage imageNamed:@"icon.png"];
NSData *data=UIImagePNGRepresentation(image);   
CFDataRef dr = CFDataCreate(NULL, [data bytes], [data length]);

ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate(); CFErrorRef erf=NULL;

if (ABPersonSetImageData(person, dr, nil))
{
    NSLog(@"successfully set image");
}
else
{
    NSLog(@"not successfully set image");
}

if( ABAddressBookSave(iPhoneAddressBook, &erf) )
{
    NSLog(@"save %s",erf);
}
else {
    NSLog(@"Not success");
}



CFRelease(dr);

CFRelease(iPhoneAddressBook); [自我dismissModalViewControllerAnimated:是];

return NO;

}

一切正常,但联系人的形象没有改变。请帮忙!

4

2 回答 2

1

看看这个线程。这是相同的代码!

关于优点:您确定对person您的方法的引用在地址簿的上下文中有效吗?我会尝试使用诸如ABAddressBookGetPersonWithRecordIDfirst 之类的函数,而不是传递ABPersonRefs 并期望它们对不同的地址簿引用有效。

似乎在那里帮助了作者:)

顺便说一句,这条线

CFDataRef dr = CFDataCreate(NULL, [data bytes], [data length]);

不需要 -NSData *并且CFDataRef可以互换:

NSData 与其核心基金会对应的 CFData 参考是“免费桥接”。这意味着 Core Foundation 类型在函数或方法调用中可以与桥接的 Foundation 对象互换。因此,在您看到 NSData * 参数的方法中,您可以传递一个 CFDataRef,而在您看到 CFDataRef 参数的函数中,您可以传递一个 NSData 实例(您将一种类型转换为另一种类型以抑制编译器警告)。这也适用于 NSData 的具体子类。有关免费桥接的更多信息,请参阅可互换数据类型。

(来自NSData 文档)。

于 2010-01-20T07:22:15.370 回答
1

你在打电话:

if (ABPersonSetImageData(person, dr, nil))

将“nil”作为图像数据传递..

于 2010-01-20T07:17:46.003 回答