ABPersonSetImageData不起作用

我正在尝试为iPhone中存储的联系人设置图片。 我使用了follwing代码snipt - (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;

}

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


你打电话给:

if (ABPersonSetImageData(person, dr, nil))

这是传递'零'作为图像数据..


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

关于优点:你确定的参考person已传递给你的方法是在地址簿中的上下文中有效? 我会尝试首先使用诸如ABAddressBookGetPersonWithRecordID的函数,而不是传递ABPersonRef ,并期望它们对于不同的地址簿引用有效。

似乎可以帮助作者:)

顺便说一句,这条线

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

不需要 - NSData *CFDataRef是可以互换的:

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

(来自NSData文档)。

链接地址: http://www.djcxy.com/p/51787.html

上一篇: ABPersonSetImageData not working

下一篇: Core Data: Quickest way to delete all instances of an entity