2010-01-20 56 views
1

我想爲我的iPhone中存儲的聯繫人設置圖像。 我用follwing代碼snipt - (BOOL)peoplePickerNavigationController:(的ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)人{ABPersonSetImageData無法正常工作

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求助!

回答

1

您致電:

if (ABPersonSetImageData(person, dr, nil)) 

這是通過 '零' 的圖像數據..

+0

你錯了 - 函數看起來像這樣:'bool ABPersonSetImageData(ABPersonRef person,CFDataRef imageData);' – 2010-01-20 07:18:43

+0

哎呦,我錯了! – Mobs 2010-01-20 07:20:54

1

看看at this thread。這是相同的代碼!

關於優點:你確定你已經傳遞給你的方法引用person是在地址簿中的上下文中有效?我會嘗試首先使用諸如ABAddressBookGetPersonWithRecordID之類的函數,而不是在周圍傳遞ABPersonRef,並期望它們對於不同的地址簿引用有效。

似乎幫助作者那裏:)

順便說一句,這條線

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

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

NSData的是「免費橋接「與其核心基金會的同行CFData Reference合作。這意味着核心基礎類型在具有橋接基礎對象的函數或方法調用中是可互換的。因此,在看到NSData *參數的方法中,可以傳遞CFDataRef,並且在看到CFDataRef參數的函數中,可以傳遞NSData實例(您將一種類型轉換爲另一種類型以抑制編譯器警告)。這也適用於你的NSData的具體子類。有關免費橋接的更多信息,請參閱可互換數據類型。

(來自NSData documentation)。