从适配器更改滚动值的表格视图

问题描述 投票:0回答:1

我开发 android(Java) 和 IOS(swift) 应用程序。我在Android端遇到了问题,我解决了。我在IOS端遇到了同样的问题,但我无法解决。

我的应用程序中有一个表格视图,我用从自己的服务器获取的数据填充它。

但是,当我滑动列表时,有时列表项中的值和图像会在列表项之间混淆。

Android端的这段小代码解决了我的问题

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}

我搜索了覆盖方法,但找不到可以解决我的问题的等效事件。

enter image description here

列表界面是这样的,一个简单的列表。

enter image description here

可能图片上传有问题,我是这样上传的

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "mainCell", for: indexPath) as! MainTableCell
        let item = radio_type_list[indexPath.row]
        cell.RadioTitle.text = item.title
        cell.RadioDescription.text = item.desc
        cell.RadioImage.downloadImageFrom(link:item.imageurl, contentMode: UIView.ContentMode.scaleToFill)
        return cell;
    }

let imageCache = NSCache<NSString, AnyObject>()
extension UIImageView {
    func downloadImageFrom(link:String, contentMode: UIView.ContentMode) {
        let imageCache = NSCache<NSString, AnyObject>()
        if let cachedImage = imageCache.object(forKey: (link as AnyObject) as! NSString) {
                    self.image = cachedImage as? UIImage
                    self.contentMode = .scaleAspectFill
                    return
                }
        
        URLSession.shared.dataTask( with: NSURL(string:link)! as URL, completionHandler: {
            (data, response, error) -> Void in
            DispatchQueue.main.async {
                self.contentMode =  contentMode
                if let data = data { self.image = UIImage(data: data) }
            }
        }).resume()
    }
}
ios swift tableview
1个回答
0
投票

出现您遇到的问题是因为图像在滚动进和滚出视图时在单元格之间混合或交换

let imageCache = NSCache<NSString, UIImage>() 

extension UIImageView {
    func downloadImageFrom(link: String, contentMode: UIView.ContentMode) {
        self.contentMode = contentMode
        self.image = nil // Clear the image initially to prevent reuse issues

       
        if let cachedImage = imageCache.object(forKey: link as NSString) {
            self.image = cachedImage
            return
        }
        
 
        URLSession.shared.dataTask(with: URL(string: link)!) { data, response, error in
            guard let data = data, error == nil, let downloadedImage = UIImage(data: data) else {
                return
            }

            // Cache the downloaded image
            imageCache.setObject(downloadedImage, forKey: link as NSString)
            
            
            DispatchQueue.main.async {
                self.image = downloadedImage
            }
        }.resume()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.