4

我有两个 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]];
    ...
}

第二个tableViewController的一大块代码

ABRecordRef person = (__bridge  ABRecordRef)contactClass.manID;
BOOL isHasImage = ABPersonHasImageData(person);

变量 isHasImage 始终为 false,即使联系人有头像。我什至在第一个 tableViewController 上检查了这个,如果人有头像,那么它返回 true 和 image。

有谁知道为什么我无法获取联系人图像?

pscontactClass.manIDid. 它有一个正确的地址,因为ABMultiValueRef multiValue = ABRecordCopyValue((__bridge ABRecordRef)contactClass.manID, kABPersonPhoneProperty);在第二个 tableViewController 中返回正确的值

4

2 回答 2

10

我可能为您提供解决方案为时已晚,但也许这会帮助其他遇到同样问题的人。至少在 iOS 5.x 上,在副本(例如,从使用 获得的数组中)看起来像ABPersonHasImageData()并且ABPersonCopyImageDataWithFormat()不能按预期工作。您可以像这样解决它:ABRecordRefABContactRefABAddressBookCopyArrayOfAllPeople()

- (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;
}
于 2012-12-17T10:13:24.533 回答
0

对此有何进一步更新?

我收到了一些用户无法看到一些联系人的缩略图的投诉。大多数情况下它工作正常,是否有任何不返回缩略图的特殊情况。

我正在使用以下代码:

 - (instancetype)initWithABContact:(ABRecordRef)contact {
          NSData *iThumbnailData = nil;
          if (ABPersonHasImageData(contact)) {
            iThumbnailData =
            CFBridgingRelease(ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail));
          }
    }
于 2014-07-28T15:18:57.987 回答