【问题标题】:UICollectionView slider image is not showingUICollectionView 滑块图像未显示
【发布时间】:2021-01-21 05:55:42
【问题描述】:

我是 swift 新手 我正在尝试使用 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)
                    }
                    
                }
            }
        }
    }

谁能指出我做错了什么

任何帮助将不胜感激

【问题讨论】:

  • 有一些可疑的逻辑可能与缓存问题无关。为什么将项目数固定为 10 而不是sliderModel 的长度?为什么要访问第 1 行的模型?对于 row == 0,这是一个负数组索引。
  • 嗨@danh 我更新了我的问题
  • 好的,现在我认为条件的两个分支是相同的,并且对滑块模型(在 cellForItem 中)的 nil 检查是多余的,但是如果您仍然遇到这些并不能解释图像问题它。作为一个学习步骤,我会尝试向自己证明,跳过所有集合视图的复杂性,是否可以从我的模型中获取图像 url 并使用它来初始化挂在主视图上的单个图像视图。
  • 嗨@danh,抱歉太复杂了,我只尝试了一张图片,只有一张图片可见,但它不会滚动,也不会下载第二张图片,但是如果我在分配@之前尝试下载图片987654324@ 它工作正常。我的猜测是与cellForItem 有关
  • @danh 我也更新了我的问题,添加更多细节和代码

标签: ios uicollectionview swift4 kingfisher


【解决方案1】:

你做错了。您不能直接在cellForItem 中联网。如果需要,您可以要求立即开始下载,当然,但您不能保留对 cell 的引用,因为用户可能会将单元格滚动到视野之外,并且可能需要在下载仍在进行时重新使用它地点。

相反,您必须下载到您的模型,然后重新加载集合视图。

【讨论】:

  • 嗨@matt你能分享我可以参考的任何链接
  • @matt - 我对 OP 的缓存图像视图库了解不多,但它们通常保留图像视图本身,并在完成网络任务后更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2011-12-03
  • 2017-07-06
  • 2013-01-25
  • 1970-01-01
  • 2018-09-27
相关资源
最近更新 更多