0

我想我在这里遇到了一个非常奇怪的问题。在我的某些 TableView 中,当我从 Parse 加载图像时,没有任何数据的单元格有时会显示其他图像。

我有我的代码的方式是检查 Parse 上的文件是否存在,如果有图片,则PFImageView在每个单元格的背景中加载图像。

但是,如果数据库中没有存储图像,PFImageView则应该使用作为占位符的本地图像。但是,通常在我PFTableView的 中,没有图像数据的单元格会从其他单元格中获取图像。有谁知道为什么?或者知道修复方法?

这是代码:

if business["businessImage"] as? PFFile != nil {
    var file: PFFile = business["businessImage"] as PFFile
    cell.businessPhoto.file = file
    cell.businessPhoto.loadInBackground()
}                        
else {
    cell.businessPhoto.image = UIImage(named: "placeholder user photo")
}

是因为我使用loadInBackground()而不是loadInBackgroundWithBlock()

4

3 回答 3

2

在不使用缓存的情况下,我找到的解决方法是先将图像文件设置cellForRowAtIndexPath为占位符图像,然后如果在服务器上找到图像对象,则将单元格图像设置为新文件,然后在后台加载.

这是代码:

        myCell.profilePic.image = UIImage(named: "placeholder user image")

        if let file: PFFile = object["profilePicture"] as? PFFile {
            myCell.profilePic.file = file
            myCell.profilePic.loadInBackground()
        }

感谢大家的帮助!

于 2015-03-07T20:02:57.333 回答
1

当您滚动浏览表格视图时,单元格会被重用。之前在该单元格中显示的图像不会被清除。您可以使用 UITableViewCell prepareForReuse方法或 UITableView 委托didEndDisplayingCell / willDisplayCell来取消图像并取消加载或该单元格。

更新

尝试这个:

func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
  cell.businessPhoto.file.cancel()
  cell.businessPhoto.image = nil
}

确保您使用自定义单元格类而不是 UITableViewCell

于 2015-03-06T22:21:40.413 回答
1

该问题没有显示基于 indexPath 设置业务的代码。希望这只是基于行的数组中的简单查找。

cell.businessPhoto.image已发布代码的一个特定问题是,在您执行异步获取的情况下,它不会立即设置。

您将看到的效果是单元格将包含来自另一行的图像(因为重复使用),同时正在获取正确的图像。解决方案是无条件设置占位符图像。

第二个问题是可选的,但几乎是必需的:缓存图像。这样,您就不会在用户滚动时继续重新获取。这会导致 cellForRowAtIndexPath 代码中的组织不同:

// this outer conditional is your original code
if (this business has a "businessImage" PFFile) {
    // new: check for cached image
    if (the image is cached) {
        set cell image to the cached image
    } else {
       // new: always set a placeholder, maybe a special one for fetching
       set cell image to a placeholder (one that indicates fetching)
       asynch fetch the image, with completion block {
           cache the image
           set cell image to the image
       }
    }
} else {
    set cell image to a placeholder (one that indicates no image)
}

请注意,我们在每种情况下都会立即设置单元格图像——即使在我们开始获取时也是如此。通过这种方式,应该不需要实现 prepareForReuse 或 didEndDisplay 钩子。

于 2015-03-07T17:19:06.710 回答