有时当我滚动我的tableview时,在我的tableview单元格中设置了错误的图像。我怎样才能解决这个问题?

时间:2016-07-14 03:57:36

标签: ios objective-c

当我在tableview上滚动时,有时在我的tableview单元格中设置了错误的图像。我怎样才能解决这个问题?以下是我cellForRowAtIndexPath方法中的相关代码。

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^{
        UIImage * image = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:self.myURL]]];
        dispatch_sync(dispatch_get_main_queue(), ^{
            cell.myImageView = image;
        });
    });
    return cell;
}

4 个答案:

答案 0 :(得分:2)

首先检查您的手机是否为nill,然后设置图像。 Becouse cell在滚动时重复使用。

请参阅以下代码,它将为您提供帮助。

static NSString *CellIdentifier = @"Cell";
   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   if (cell == nil)
   {
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^{
        UIImage * image = [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:self.myURL]]];
        dispatch_sync(dispatch_get_main_queue(), ^{
            cell.myImageView = image;
        });
    });
}
return cell;

答案 1 :(得分:1)

您的图像数据是异步下载的,但在重复使用时不会被取消。

因为UITableViewCells被重用,所以这些类型的异步调用需要在单元重用时被取消,否则它们可以在你已经将新数据加载到它们中时完成。

我的建议是使用像SDWebImage这样的库来加载你的图像。它使用比上面列出的更少的代码下载,缓存和显示您的图像。

https://github.com/rs/SDWebImage

答案 2 :(得分:1)

我对您的代码做了一些更改,我认为它会对您有所帮助

cell.myImageView = nil; // or  cell.myImageView = [UIImage imageNamed:@"placeholder.png"];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:self.myURL]];
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
                if (data) {
                    UIImage *image = [UIImage imageWithData:data];
                    if (image) {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            MyCell *myCell = (id)[tableView cellForRowAtIndexPath:indexPath];
                            if (myCell)
                                myCell.myImageView = image;
                        });
                    }
                }
            }];
   [task resume];
   return cell;

并使cell.myImageView = nil;或者在

中设置占位符图像
- tableView:didEndDisplayingCell:forRowAtIndexPath: 

您只需使用 SDWebImage 即可 tutorial link

答案 3 :(得分:0)

试试这段代码。您需要在发生错误时将图像设置为nil,或者在url

中获取数据时不形成图像
let request = NSMutableURLRequest.init(URL: NSURL.init(string: "self.myURL")!)

        let dataTask = NSURLSession.sharedSession().dataTaskWithRequest(request){(data, response, error) in

            if let imageData = data
            {
                let image = UIImage.init(data: data!)
                if((image) != nil)
                {
                    dispatch_async(dispatch_get_main_queue(), ^{

                        cell.myImageView = image

                        });
                }
                else
                {
                    cell.myImageView = nil;
                }

            }
            else
            {
                cell.myImageView = nil
                print(error?.description)
            }
        }


        dataTask.resume();

*