iOS не может получить изображение человека
У меня есть два tableViewControllers. У первого есть список контактов. Другой показывает подробную информацию о человеке.
Кусок кода первого tableViewController
ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
NSArray *allPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source,kABPersonSortByFirstName);
for ( int i = 0; i < [allPeople count]; i++ )
{
...
contactClass = [[ContactClass alloc] initWithName:name surName:surName manID:[allPeople objectAtIndex:i]];
...
}
Кусок кода второй таблицы ViewController
ABRecordRef person = (__bridge ABRecordRef)contactClass.manID;
BOOL isHasImage = ABPersonHasImageData(person);
Переменная isHasImage всегда ложна, даже если у контакта есть аватар. Я даже проверил это на первом tableViewController и если у человека есть аватар, то он возвращает true и изображение.
Кто-нибудь знает, почему я не могу получить изображение контактов?
п.с. contactClass.manID
это тип id
, У него правильный адрес, потому что ABMultiValueRef multiValue = ABRecordCopyValue((__bridge ABRecordRef)contactClass.manID, kABPersonPhoneProperty);
возвращает правильное значение во второй tableViewController
2 ответа
Я могу опоздать на решение для вас, но, возможно, это поможет другим, которые застряли с той же проблемой. Похоже ABPersonHasImageData()
а также ABPersonCopyImageDataWithFormat()
не работает, как ожидалось ABRecordRef
копии (например, ABContactRef
из массива, полученного с помощью ABAddressBookCopyArrayOfAllPeople()
), как минимум на iOS 5.x. Вы можете обойти это так:
- (UIImage*)imageForContact: (ABRecordRef)contactRef {
UIImage *img = nil;
// can't get image from a ABRecordRef copy
ABRecordID contactID = ABRecordGetRecordID(contactRef);
ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef origContactRef = ABAddressBookGetPersonWithRecordID(addressBook, contactID);
if (ABPersonHasImageData(origContactRef)) {
NSData *imgData = (NSData*)ABPersonCopyImageDataWithFormat(origContactRef, kABPersonImageFormatOriginalSize);
img = [UIImage imageWithData: imgData];
[imgData release];
}
CFRelease(addressBook);
return img;
}
Любое дальнейшее обновление по этому поводу?
Я получил жалобы на то, что какой-то пользователь не смог увидеть эскиз для нескольких контактов. В основном это работает нормально, есть ли особый случай, когда миниатюры не возвращаются.
Я использую следующий кусок кода:
- (instancetype)initWithABContact:(ABRecordRef)contact {
NSData *iThumbnailData = nil;
if (ABPersonHasImageData(contact)) {
iThumbnailData =
CFBridgingRelease(ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail));
}
}