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));
          }
    }
Другие вопросы по тегам