我开发 android(Java) 和 IOS(swift) 应用程序。我在Android端遇到了问题,我解决了。我在IOS端遇到了同样的问题,但我无法解决。
我的应用程序中有一个表格视图,我用从自己的服务器获取的数据填充它。
但是,当我滑动列表时,有时列表项中的值和图像会在列表项之间混淆。
Android端的这段小代码解决了我的问题
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
我搜索了覆盖方法,但找不到可以解决我的问题的等效事件。
列表界面是这样的,一个简单的列表。
可能图片上传有问题,我是这样上传的
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()
}
}
出现您遇到的问题是因为图像在滚动进和滚出视图时在单元格之间混合或交换
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()
}
}