2

嗨,我正在创建自定义通讯簿,我只想让这个拥有电子邮件地址的用户一切正常,但是当我尝试在 tableview 中显示图像时,它给了我EXCBAD Error。我有这样的代码

            ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
    for (CFIndex i = 0; i < CFArrayGetCount(people); i++) {
        ABRecordRef person = CFArrayGetValueAtIndex(people, i);

        ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
        for (CFIndex j=0; j < ABMultiValueGetCount(emails); j++) {

            UIImage *img;

            if(ABPersonHasImageData(person))
            {
//              img = [UIImage imageWithData:(NSData *)ABPersonCopyImageDataWithFormat(person,kABPersonImageFormatThumbnail)];
                img = [UIImage imageWithData:(NSData *)ABPersonCopyImageData(person)];
//                if(img != nil)
//                {
//                    [arrImage addObject:img];
//                }
//                else
//                {
                    img = [UIImage imageNamed:@"icon-9.png"];
                    [arrImage addObject:img];
//                }
            }else
            {
                img = [UIImage imageNamed:@"icon-9.png"];
                [arrImage addObject:img];
            }


            NSString* email = (NSString*)ABMultiValueCopyValueAtIndex(emails, j);


//          [arrImage addObject:img];
            [arrEmail addObject:email];

            [img release];
            [email release];
        }
        CFRelease(emails);
    }
    CFRelease(addressBook);
    CFRelease(people);

在上面的代码中,我正在获取图像并将图像存储在 NSMutableArray 中,它将被完美地存储。但是当我要在下面的代码中显示图像时

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UIImageView* imagePhoto;

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableFriends dequeueReusableCellWithIdentifier:CellIdentifier];
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

    imagePhoto= [[[UIImageView alloc] initWithFrame:CGRectMake(43.0,10.0,40, 40)] autorelease]; 

    if ([arrEmail count] != 0) 
    {
        imagePhoto.image = [arrImage objectAtIndex:indexPath.row];
        [cell.contentView addSubview:imagePhoto];

        cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",[arrEmail objectAtIndex:indexPath.row]];
        cell.detailTextLabel.textColor = [UIColor whiteColor];


    }
    return cell;
}

当从这里调用图像时,它可以完美地工作,img = [UIImage imageNamed:@"icon.png"];但是当从地址簿调用图像时,它会给我错误EXCBAD Error,说明该代码有什么问题?如何将图像存储在 NSMutabeArray 中并显示图像?

嘿,帮帮我,任何人都可以帮助我或建议我像Google Latitude 那样实现,你可以在 iPhone 通讯录中添加朋友看到从通讯录中获取图像请帮助我....

4

4 回答 4

4

我已经像这样将图像存储在 NSMutableDictionary 的对象中

personrecord 是

ABRecordRef

假设您正在 ARC 模式下构建项目。

NSData *imgData = (__bridge_transfer NSData *) ABPersonCopyImageDataWithFormat(personrecord, kABPersonImageFormatThumbnail);

            如果(图像数据)
            {
                UIImage *personImage = [UIImage imageWithData:imgData];
                imgData = 无;
                [dict setValue:personImage forKey:@"UserImage"];
            }
            别的
            {
                UIImage *personImage = [UIImage imageNamed:@"defalt_contact_img.png"];
                [dict setValue:personImage forKey:@"UserImage"];
            }

您可以操作代码以满足您的要求,我正在使用字典,而您正在使用数组,因此您可以使用数组的 addObject 方法来存储图像,

我总是喜欢从通讯簿中获取具有多个字典的可变数组中的记录,这样对记录的操作就变得容易了。

于 2013-03-05T07:04:08.897 回答
2

尝试检查图像是否可用或未使用

if( ABPersonHasImageData( person ) ) {
       UIImage* img = [UIImage imageWithData:(NSData *)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)]
    }
于 2012-04-06T15:30:27.140 回答
0

您需要检查是否有可用图像的条件。

NSData *data = (NSData *)ABPersonCopyImageData(person);
UIImage *img = [UIImage imageWithData:data];

如果(img!= 无)
{
  // 在此处分配图像
}
别的
{
  img = [UIImage imageNamed:@"icon.png"];
}

我刚刚清除了你的代码。我认为这可能会有所帮助。

于 2012-04-06T13:44:20.360 回答
0

您不能直接将图像对象添加到数组中,您需要先将图像转换为 NSData 并添加到数组中,然后在显示图像时将 NSdata 转换为图像。希望能帮助到你。

于 2012-04-07T13:33:04.507 回答