2013-05-13 116 views
2

嗨,我的问题是,当我滚动UITableView细胞图像实际上这些图像是在web服务器和我并使用asyncdownloading下载它。我在UITableViewCell上添加了UIImageView。图像成功地显示在UITableViewCell但是当我滚动的tableview图像的变化是这样的代码单元格图像更改滚动UITableView

- (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; 
} 

回答

0

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

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

+0

对从内存清除图像扩大,'NSCache'会是一个更好的存储类;那么你不需要编写任何逻辑。或者更好,不要重新发明轮子,并使用SDWebImage。 – 2013-05-13 14:09:28

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; 

     } 

    }]; 

希望这是明确的有用:)

0

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

((UIImageView *)[cell viewWithTag:10]).image = nil; 
相关问题