在滚动UITableView时更改单元格图像

时间:2013-05-13 13:49:02

标签: iphone objective-c uitableview

我的问题是当我滚动UITableView单元格图像实际上这些图像在网络服务器和我下载并使用asyncdownloading下载时。我在UIImageView上添加了UITableViewCell。图像在UITableViewCell上成功显示但当我滚动tableview图像时,这是代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DefaultCell"];
       searchobjectval =[self.arrSearchResult objectAtIndex:indexPath.row];
    if(cell == nil)
    {
        cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"DefaultCell"];



    }

    UILabel *areaLbl = (UILabel *)[cell viewWithTag:1];
    UILabel *postTitle = (UILabel *)[cell viewWithTag:2];
    UILabel *roomCost = (UILabel *)[cell viewWithTag:3];
    UILabel *description = (UILabel *)[cell viewWithTag:4];
    areaLbl.text =searchobjectval.location;
    postTitle.text = searchobjectval.title;
    roomCost.text = searchobjectval.roomCost;
    description.text =searchobjectval.description;

    [tableView setSeparatorColor:[UIColor blueColor]];

    UIView *myView = [[UIView alloc] init];
    if (indexPath.row % 2)
    {
        UIColor* clr = [UIColor colorWithRed:0.4f green:0.6f blue:0.8f alpha:1];
        myView.backgroundColor = clr;
    }
    else
    {
        myView.backgroundColor = [UIColor whiteColor];
    }
    cell.backgroundView = myView;

    NSLog(@" search object image %@",searchobjectval.imgLink);


    // Pass along the URL to the image (or change it if you are loading there locally)
    [AsyncImagesDownloading processImageDataWithURLString:[NSString stringWithFormat: @"http://192.95.48.72/bedspace/new_arrivals_img/%@",searchobjectval.idVal ] andBlock:^(NSData *imageData)
     {
         if (self.view.window)
         {
             UIImage *image = [UIImage imageWithData:imageData];
             UIImageView *imgVw = (UIImageView *)[cell viewWithTag:10];
             imgVw.image = image;
         }
     }];




    return cell;
}

6 个答案:

答案 0 :(得分:2)

对于内存管理目的,UITableView重用其单元格UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DefaultCell"];,并在向上或向下滚动时加载单元格内容。如果你没有将数据提取到单元格的元素,那么当你向后滚动它时,你将在最后一次使用单元格时获取最后一个值。

在你的情况下:

// Pass along the URL to the image (or change it if you are loading there locally)
    [AsyncImagesDownloading processImageDataWithURLString:[NSString stringWithFormat: @"http://192.95.48.72/bedspace/new_arrivals_img/%@",searchobjectval.idVal ] andBlock:^(NSData *imageData)
     {
         if (self.view.window)
         {
             UIImage *image = [UIImage imageWithData:imageData];
             UIImageView *imgVw = (UIImageView *)[cell viewWithTag:10];
             imgVw.image = image;
         }
     }];

因此,当!self.view.window您将拥有最后一次使用该单元格的图像时(if子句返回TRUE),它将在滚动时更改。你需要做的是:

// Pass along the URL to the image (or change it if you are loading there locally)
    [AsyncImagesDownloading processImageDataWithURLString:[NSString stringWithFormat: @"http://192.95.48.72/bedspace/new_arrivals_img/%@",searchobjectval.idVal ] andBlock:^(NSData *imageData)
     {
         if (self.view.window)
         {
             UIImage *image = [UIImage imageWithData:imageData];
             UIImageView *imgVw = (UIImageView *)[cell viewWithTag:10];
             imgVw.image = image;

         } else {

             UIImage *image = [UIImage imageNamed:@"placeHolder.png"];
             UIImageView *imgVw = (UIImageView *)[cell viewWithTag:10];
             imgVw.image = image;

        }

     }];

希望这显然是有用的:)

答案 1 :(得分:0)

您应该将图片存储为searchobjectval上的属性,并将其设置在cellForRowAtIndexPath的图片视图中。异步加载完成后,检查图像的目标单元格是否可见,如果是,则重新加载。如果单元格不可见,您只需等待它再次可见,然后cellForRowAtIndexPath将为您设置它。

请记住,如果这些图像很大并且self.arrSearchResult存在很长时间,那么如果图像开始变低,你还应该在其中放置一些逻辑来清除内存中的图像。

答案 2 :(得分:0)

为什么不使用单元格和IB执行此操作cell.yourImageView=[UIImage imageWithData:imageData];?我认为这个答案很有用https://stackoverflow.com/a/3634414/2000162

答案 3 :(得分:0)

您可以尝试使用apple为图像加载器和文本加载器提供的更好的方法,这将使tableview滚动更快,链接在下面

http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html

答案 4 :(得分:0)

dequeueReusableCellWithIdentifier从队列中获取UITableViewCell对象。从队列中取出时,单元格的内容不会被清除,因此在您的下载完成并且UIImageView的图像被覆盖之前,此单元格可能会显示“错误”的图像。尝试将单元格出列后将图像属性设置为nil,以便在加载新数据之前不显示任何内容。

((UIImageView *)[cell viewWithTag:10]).image = nil;

答案 5 :(得分:0)

这基本上是在请求尚未完成但您已滚动到其他单元格时发生的。由于重用单元格,UITableView会将其视为相同的单元格,并会在显示的单元格上呈现图像。

这是文章 https://medium.com/@bipolarbear/uitableview-with-images-from-api-8902ba507bff

<强>声明: 我写了这个博客