ABPersonSetImageData不起作用

时间:2010-01-20 07:15:02

标签: iphone addressbook

我正在尝试为存储在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;

}

每件事情都在发挥作用,但联系人的形象并没有改变。 请帮忙!

2 个答案:

答案 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)。