UIImageView没有显示在自定义UITableViewCell中

时间:2011-02-18 17:04:25

标签: iphone objective-c uitableview

以下是代码:

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

static NSString *CellIdentifier = @"ConvoreCell";

ConvoreCell * cell = (ConvoreCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ConvoreCell" owner:nil options:nil];
    for (id currentObject in topLevelObjects){
        if ([currentObject isKindOfClass:[UITableViewCell class]]){
            cell = (ConvoreCell *) currentObject;
            break;
        }
    }
}

NSMutableDictionary *cellValue = [results objectAtIndex:indexPath.row];

NSString *picURL = [[cellValue objectForKey:@"creator"] objectForKey:@"img"];
if ([picURL isEqualToString:@"https://secure.gravatar.com/avatar/1f043010eb1652b3fab3678167dc0487/?default=https%3A%2F%2Fconvore.com%2Fmedia%2Fimages%2Feric.png&s=80"])
    picURL = @"https://convore.com/media/images/eric.png";

if ((picURL != (NSString *) [NSNull null]) && (picURL.length !=0)) {
    NSLog(@"%@", picURL);
    NSData *imgData = [[[NSData dataWithContentsOfURL:
                         [NSURL URLWithString:
                          picURL]] autorelease] retain];
    [cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]];

} else {
    cell.pic = nil;
}


//NSLog(@"Name is : %@", [cellValue objectForKey:@"name"]);
cell.title.text = [cellValue objectForKey:@"name"];
cell.info.text = (@"Created by: %@", [[cellValue objectForKey:@"creator"] objectForKey:@"name"]);
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;



// Configure the cell...

return cell;

}

由于某种原因,图像没有显示出来。我在这做错了什么?图片的网址有效,我查了一下。

另外我不想在TableViewCell上有配件视图,我确实在IB中指定为no,但它仍然显示...我将配件属性设置为无

4 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题。

NSData *imgData = [[[NSData dataWithContentsOfURL:
                     [NSURL URLWithString:
                      picURL]] autorelease] retain];

前者不是一个真正的问题(也许是巧合?!),但它很丑陋而令人困惑。摆脱自动释放和保留。您从dataWithContentsOfURL获取的对象已经自动释放。


[cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]];

你真正的问题可能是这个。据我所知,你应该只调用一次init;在你分配了一个对象之后。

因此,如果cell.pic是UIImageView,我会尝试将代码更改为:

cell.pic.image = [[[UIImage alloc] initWithData:imgData] autorelease];

看到图像后,您应该更改代码,以便将图像保存在用于填充单元格的数据中。每次出现单元格时都会下载图像。这是你不应该做的事情。但这超出了这个问题。

编辑:

  

我也不想拥有   TableViewCell上的附件视图,I   确实在IB中指定为否,但它   仍显示... 我设置了配件   属性为无

你呢?但我可以看到这行代码:

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

答案 1 :(得分:0)

你应该能够通过

获得UIImage
[cell.pic initWithImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSUrl NSURL picURL]]]];

答案 2 :(得分:0)

您没有展示您的cellForRowAtIndexPath方法,这是分析正在发生的事情的关键。典型的范例是UITableViewCell对象被UITableView重复使用。当UITableView调用cellForRowAtIndexPath时,您应该将UIImage设置为单元格。

答案 3 :(得分:0)

导致您立即崩溃的问题是ConvoreCell的笔尖正在尝试设置您已声明的IBOutlet,但却找不到实际设置它的方法。我会检查你是否合成了你的pic属性。 这里还有其他问题。这条线

    [cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]];

错了;您不要在已存在的对象上调用init,而只在分配对象时调用init。做点什么

cell.pic = [[[WhateverClassPicIS alloc] initWithImage:[[UIImage alloc] initWithData:imgData]];

此外,您在主线程上使用NSData dataWithContentsOfURL。当您连接到网络时,这将锁定您的用户界面不确定的时间。改为使用异步调用。