UICollectionView滑块图像未显示

问题描述

我是新手 我正在尝试使用可正常工作的UICollectionView制作滑块,

但是当我尝试实现缓存(Kingfisher)时,它不会在滑块中显示我的图像

这是我的实现方式

extension CompanyViewController: UICollectionViewDelegate,UICollectionViewDataSource {


func collectionView(_ collectionView: UICollectionView,numberOfItemsInSection section: Int) -> Int {
   if(self.sliderModel != nil){
    return (self.sliderModel?.data.count)!
   }else{
    return 0
    }
}

func collectionView(_ collectionView: UICollectionView,cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell",for: indexPath) as! BannerCollectionViewCell
    
     if(self.sliderModel != nil){
        
        if(self.sliderModel.data.count == indexPath.row){
            let url = URL(string:(self.sliderModel?.data[indexPath.row].experienceImage.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed ))!)
            cell.sliderImageView.kf.setimage(with: url)
        }else{
            //cell.sliderImageView.image = self.imgArr[indexPath.row]
            let url = URL(string:(self.sliderModel?.data[indexPath.row].experienceImage.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed ))!)
            cell.sliderImageView.kf.setimage(with: url)
        }
    }
    
    return cell
}
}

但是图像在我的滑块中不可见,我检查了模型,我从服务器获取了响应,并且图像URL中有图像。 可能是我在错误的位置下载了图像。

这就是我获取jsondata并将其分配到模型中的方式

func getBannerData(){
         dispatchGroup.enter()
        let defaults = UserDefaults.standard
        let appId = defaults.string(forKey: Constants.APPID)
        let token = "Bearer "+defaults.string(forKey: Constants.TOKEN)!
        if let url = URL(string: Constants.EXPERIENCE_BANNER_CENTER+appId!){
            var request = URLRequest(url: url)
            request.httpMethod = "GET"
            request.setValue(token,forHTTPHeaderField:"Authorization")
            apimanager.sharedInstance.getCall(request: request){
                (data) in
                if(!data.isEmpty){
                    do{
                        self.sliderModel = try JSONDecoder().decode(SliderModel.self,from: Data(data.utf8))
                        dispatchQueue.main.async {
                            self.pageView.numberOfPages = (self.sliderModel?.data.count)!
                            self.sliderCollectionView.reloadData()
                           
                        }
                        self.timer = Timer.scheduledTimer(timeInterval: 2.0,target: self,selector: #selector(self.changeImage),userInfo: nil,repeats: true)
                        
                        self.stopActivityIndicator()
                        self.dispatchGroup.leave()
                    }
                    catch{
                        self.stopActivityIndicator()
                        self.showAlertMessage(alertMessage: Constants.COMMON_ERROR)
                    }
                    
                }
            }
        }
    }

有人可以建议我做错了吗

任何帮助将不胜感激

解决方法

您在做什么是错误的。您无法直接在cellForItem中建立网络。当然,您可以要求下载,如果需要的话,现在开始,但是您不能保留对cell的引用,因为在下载过程中,用户可能会将单元格滚动到视线之外,并且可能需要重新使用。仍在发生。

相反,您必须将其下载到模型中,然后重新加载收集视图。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...