我正在尝试为存储在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); [self dismissModalViewControllerAnimated:YES];
return NO;
}
每件事情都在发挥作用,但联系人的形象并没有改变。 请帮忙!
答案 0 :(得分:1)
if (ABPersonSetImageData(person, dr, nil))
传递'nil'作为图像数据..
答案 1 :(得分:1)
看看at this thread。这是相同的代码!
关于优点:您确定传递给您的方法的person
引用在地址簿的上下文中是否有效?我会尝试首先使用ABAddressBookGetPersonWithRecordID
之类的函数,而不是传递ABPersonRef
并期望它们对不同的地址簿引用有效。
似乎在那里帮助作者:)
BTW,这一行
CFDataRef dr = CFDataCreate(NULL, [data bytes], [data length]);
不需要 - NSData *
和CFDataRef
可以互换:
NSData与其Core Foundation对应的CFData Reference是“免费桥接”。这意味着Core Foundation类型在函数或方法调用中可与桥接的Foundation对象互换。因此,在您看到NSData *参数的方法中,您可以传递CFDataRef,并且在您看到CFDataRef参数的函数中,您可以传递NSData实例(将一种类型转换为另一种类型以禁止编译器警告)。这也适用于NSData的具体子类。有关免费桥接的详细信息,请参阅可互换数据类型。
(来自NSData documentation)。