2

嗨,我的问题是当我滚动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;
}
4

6 回答 6

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您将获得最后一次使用单元格的图像时(如果子句返回 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;

        }

     }];

希望这很明显有用:)

于 2013-05-13T14:58:38.437 回答
0

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

于 2013-05-13T14:03:30.537 回答
0

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

((UIImageView *)[cell viewWithTag:10]).image = nil;
于 2013-08-29T07:43:24.090 回答
0

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

请记住,如果这些图像很大并且self.arrSearchResult存在很长时间,您还应该在其中放置一些逻辑以在图像开始不足时从内存中清除图像。

于 2013-05-13T13:54:47.803 回答
0

您可以尝试苹果为图像加载器和文本加载器提供的一种更好的方法,这将使 tableview 滚动更快链接如下

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

于 2013-05-13T14:55:39.603 回答
0

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

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

免责声明: 我写了这个博客

于 2017-11-23T11:40:49.333 回答