使用 ImageSlideshow 窗格时显示上一个 tableview 单元格中的重复图像

showing duplicated images from previous tableview cell when using ImageSlideshow pod

提问人:abdallah eslah 提问时间:5/22/2021 最后编辑:abdallah eslah 更新时间:5/23/2021 访问量:234

问:

这是我的回应,哪个媒体是我想要在TableView中水平显示的幻灯片视图中的图像:


media": [
                    {
                        "id": 555,
                        "postId": 274,
                        "media": "https://onebusinessqrcode.s3.us-east-2.amazonaws.com/b885b600-2d2c-5d84-aa64-259e946763e9.png",
                        "createdAt": "2021-05-22T04:01:03.351Z",
                        "updatedAt": "2021-05-22T04:01:03.351Z"
                    },
                    {
                        "id": 554,
                        "postId": 274,
                        "media": "https://onebusinessqrcode.s3.us-east-2.amazonaws.com/81a71835-1808-5d16-b9ff-062a345a9612.png",
                        "createdAt": "2021-05-22T04:01:03.154Z",
                        "updatedAt": "2021-05-22T04:01:03.154Z"
                    }
                ]

但是突然我发现我在同一表视图行的视图中得到了这样的重复图像,并且我没有一个单元格的所有图片,您知道它可能来自可重复使用的单元格!可能是从数组中得到的图像,我突然重复了它!!:

滚动时单元格中的图像数增加

see the image
我不知道为什么这是我的代码可能会帮助你


// arr to store all images I got from server to show them
var postImages = [SDWebImageSource]()

在 cellForRowAt for tableView 中:

    //Configure the cell...
    let postText = ArraysModel.posts[indexPath.row]
    if let pictureString = postText.media {
            let cell = tableView.dequeueReusableCell(withIdentifier: "PicCell", for: indexPath) as! PicCell
        
        cell.postTextLabel.text = postText.postText

        
        for image in pictureString {
            let sources = SDWebImageSource(urlString: image.media  ?? "")
            if let sdImages = sources {
                postImages.append(sdImages)
            }
        }

            cell.slideShowImage.setImageInputs(postImages)
            cell.slideShowImage.contentScaleMode = UIViewContentMode.scaleAspectFill
            cell.slideShowImage.activityIndicator = DefaultActivityIndicator()
            cell.slideShowImage.delegate = self

            return cell
    }
iOS Swift iPhone Xcode UITableView

评论


答:

0赞 Mohammed Abdul Basith 5/23/2021 #1

您可以在 PicCell 类中添加它

override func prepareForReuse() {
    super.prepareForReuse()
    self.slideShowImage.setImageInputs([])
    self.postImages.removeAll()
}

并像这样更改您的tableview委托方法

let postText = ArraysModel.posts[indexPath.row]
if let pictureString = postText.media {
    let cell = tableView.dequeueReusableCell(withIdentifier: "PicCell", for: indexPath) as! PicCell
    cell.postTextLabel.text = postText.postText
    cell.prepareForReuse()
    for image in pictureString {
        let sources = SDWebImageSource(urlString: image.media  ?? "")
        if let sdImages = sources {
            postImages.append(sdImages)
        }
    }
    cell.slideShowImage.setImageInputs(postImages)
    cell.slideShowImage.contentScaleMode = UIViewContentMode.scaleAspectFill
    cell.slideShowImage.activityIndicator = DefaultActivityIndicator()
    cell.slideShowImage.delegate = self
    return cell
}

评论

0赞 abdallah eslah 5/23/2021
谢谢你解决了你真的帮助了我兄弟^^你能给我解释一下准备 froReuse 以及为什么我从数组中删除项目
0赞 Mohammed Abdul Basith 5/23/2021
如果 UITableViewCell 对象是可重用的(即,它具有重用标识符),则在从 UITableView 方法 dequeueReusableCell(withIdentifier:) 返回对象之前调用此方法。出于性能原因,应仅重置单元格中与内容无关的属性,例如 alpha、编辑和选择状态。在重用单元格时,tableView(_:cellForRowAt:) 中表视图的委托应始终重置所有内容。如果单元格对象没有关联的重用标识符,则不会调用此方法。
0赞 Mohammed Abdul Basith 5/23/2021
如果重写此方法,则必须确保调用超类实现。