2010-01-20 2 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 rejectModalViewControllerAnimated: YES];

return NO; 

}

каждая вещь работает, но изображение контакта не меняется. PLZ помощь!

ответ

1

вы звоните:

if (ABPersonSetImageData(person, dr, nil)) 

, проходящее 'ноль' в качестве данных изображения ..

+0

Вы ошибаетесь - функция выглядит следующим образом: 'bool ABPersonSetImageData (ABPersonRef person, CFDataRef imageData);' –

+0

whoops, я ошибаюсь! – Mobs

1

Посмотрите at this thread. Это тот же код!

Что касается существа дела: вы уверены, что ссылка на person, которую вы передали вашему методу, действительна в контексте адресной книги? Сначала я попытался использовать функцию, такую ​​как ABAddressBookGetPersonWithRecordID, вместо того, чтобы проезжать ABPersonRef и ждать, что они будут действительны для разных ссылок в адресной книге.

Показалось, чтобы помочь автору там :)

Кстати, эта линия

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

не нужен - NSData * и CFDataRef являются взаимозаменяемыми:

NSData является «бесплатный мостовая »Со своим партнером Core Foundation, CFData Reference. Это означает, что тип Core Foundation является взаимозаменяемым при вызове функций или методов с мостовым объектом Foundation. Поэтому в методе, где вы видите параметр NSData *, вы можете передать CFDataRef, а в функции, где вы видите параметр CFDataRef, вы можете передать экземпляр NSData (вы передали один тип другому для подавления предупреждений компилятора). Это также относится к вашим конкретным подклассам NSData. См. «Сменные типы данных» для получения дополнительной информации о бесплатном мостовом соединении.

(from NSData documentation).