我有两个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。
有谁知道为什么我无法获得联系人图片?
P.S。 contactClass.manID
的类型为id
。它有一个正确的地址,因为ABMultiValueRef multiValue = ABRecordCopyValue((__bridge ABRecordRef)contactClass.manID, kABPersonPhoneProperty);
在第二个tableViewController中返回正确的值
答案 0 :(得分:10)
我可能为你找到一个解决方案为时已晚,但也许这会帮助那些遇到同样问题的人。
看起来ABPersonHasImageData()
和ABPersonCopyImageDataWithFormat()
在ABRecordRef
副本上无法正常工作(例如,使用ABContactRef
获取的数组中的ABAddressBookCopyArrayOfAllPeople()
) 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;
}
答案 1 :(得分:0)
对此有何进一步的更新?
我收到的投诉是某些用户无法看到一些联系人的缩略图。大多数情况下它工作正常,是否有任何特殊情况下缩略图都没有返回。
我正在使用以下代码:
- (instancetype)initWithABContact:(ABRecordRef)contact {
NSData *iThumbnailData = nil;
if (ABPersonHasImageData(contact)) {
iThumbnailData =
CFBridgingRelease(ABPersonCopyImageDataWithFormat(contact, kABPersonImageFormatThumbnail));
}
}