ios - 在 UITable View Swift 中滚动时图片变得混合
问题描述
我的程序中有一个带有 dequeueReusableCells 的 UITable 视图我应该从服务器加载几个图像并在幻灯片中显示它们
我有一个自定义单元格,在配置每个单元格时,我在 DispatchQueue.global(qos: .userInitiated).async 和 DispatchQueue.main.async 中下载图像,我将下载的图片添加到幻灯片放映图像中
但是当我开始滚动一些不应该有任何图片的单元格时,有另一个单元格的重复图片
你知道是什么原因造成的吗?!
我在每个单元格中使用 swift 和 ImageSlideShow pod 进行幻灯片放映
这是我的代码的一些部分:
在我的新闻单元类中,我有以下部分用于获取图像:
class NewsCell: UITableViewCell{
@IBOutlet weak var Images: ImageSlideshow!
@IBOutlet weak var SubjectLbl: UILabel!
@IBOutlet weak var NewsBodyLbl: UILabel!
func configureCell(news: OneNews) {
self.SubjectLbl.text = news.Subject
self.NewsBodyLbl.text = news.Content
if news.ImagesId.count==0{
self.Images.setImageInputs([ImageSource(image: UIImage(named: "ImagePlaceholderIcon")!)])
}
else{
for imgId in news.ImagesId {
let Url = URL(string: "\(BASE_URL)\(NEWS_PATH)/\(imgId)/pictures")
DispatchQueue.global(qos: .userInitiated).async {
let data = try? Data(contentsOf: Url!)
DispatchQueue.main.async {
if let d = data {
let img = UIImage(data: data!)!
imageSrc.append(ImageSource(image: img))
self.Images.setImageInputs(imageSrc);
}
}
}
}
}
self.Images.slideshowInterval = 3
}
这是 cellForRow 方法:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = generalNewsTableView.dequeueReusableCell(withIdentifier: "NewsCell" , for: indexPath) as! NewsCell
if let news = NewsInfo.sharedInstance.getGeneralNews(){
cell.configureCell(news: news[indexPath.row])
}
return cell
}
getGeneralNews() 是一个 getter,它返回一个新闻数组,所以我在 cellForRowAt 中所做的是我在给定的索引路径中获取新闻并用它配置我的单元格。
class NewsInfo {
static var sharedInstance = NewsInfo()
private init(){}
private (set) var generalNews:[OneNews]!{
didSet{
NotificationCenter.default.post(name:
NSNotification.Name(rawValue: "GeneralNewsIsSet"), object: nil)
}
}
func setGeneralNews(allGeneralNews:[OneNews]){
self.generalNews = allGeneralNews
}
func getGeneralNews() -> [OneNews]!{
return self.generalNews
}
}
每个新闻都包含一个图片ID数组
这些是我的 OneNews 类 var Subject :String 中的字段!变量内容:字符串!var ImagesId:[整数]!
谢谢 !
解决方案
UITableViewCell 在您滚动时被重用。当一个单元格离开屏幕顶部时,它将被重新用于出现在屏幕底部的另一行。
UITableViewCell 有一个prepareForReuse
可以覆盖的方法。您可以使用该方法清除 iamgeViews 或任何其他应重置或取消图像下载的状态。
在您的情况下,您可能不应该使用Data(contentsOf:)
它,因为它没有给您提供取消它的方法。URLSessionDataTask
将是一个更好的选择,因为它可以让您在完成之前取消请求。
推荐阅读
- mysql - 启动 mysqld.service 失败:未找到单元
- android - 辅助功能(TalkBack):如何在加载完整片段后自动聚焦特定视图?
- laravel - Laravel HTML
- css - 在 component.ts Angular 中使用可变颜色
- javascript - 从 querySelectorAll("input") 中排除所有文本类型输入
- python - .bash_profile 和 .bashrc 文件中的两个不同的 $WORKON_HOME 和 $PROJECT_HOME 变量
- php - 为 foreach() 提供的参数无效,在 Wordpress 中没有结果或错误
- jenkins-pipeline - 在 Artifactory 中推广 jenkins 构建
- pentaho - 通过脚本将环境变量传递给 Pentaho Kettle 转换
- sql-server - VBNET中应该使用什么错误处理