首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >第二个UICollectionView未重新加载

第二个UICollectionView未重新加载
EN

Stack Overflow用户
提问于 2018-06-01 12:44:56
回答 3查看 664关注 0票数 0

我正在尝试在同一个UIViewController中实现两个UICollectionView。然而,这是错误的,当我运行应用程序时,只有一个UICollectionView显示,另一个则保持空白。我尝试了很多方法来解决这个问题,但我总是以失败告终。

代码语言:javascript
复制
import UIKit

class ViewController: UIViewController, UICollectionViewDataSource {

    @IBOutlet var collectionView: UICollectionView!
    @IBOutlet weak var collectionViewBanner: UICollectionView!


    var dataSource: [Content] = [Content]()
    var dataBanner: [Banner] = [Banner]()

    override func viewDidLoad() {
        super.viewDidLoad()

        getBanner { (data) in
            DispatchQueue.main.async {
                self.dataBanner = data
                self.collectionViewBanner.reloadData()
            }
        }


        getAudiobooksAPI { (data) in
            DispatchQueue.main.async {
                self.dataSource = data
                self.collectionView.reloadData()
            }
        }
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if self.collectionView.tag == 1 {
            return  self.dataSource.count
        } else {
            return self.dataBanner.count
        }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if (collectionView == self.collectionView) {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell

            let content = self.dataSource[indexPath.item]

            cell.bookLabel.text = content.descricao
            cell.bookImage.setImage(url: content.urlImagem, placeholder: "")

            return cell

        } else if (collectionView == self.collectionViewBanner) {

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCellBanner", for: indexPath) as! CollectionViewCell

            let content = self.dataBanner[indexPath.item]

            cell.bannerImage.setImage(url: content.urlImagem, placeholder: "")

            return cell
        }
        return UICollectionViewCell()
    }

}

extension UIImageView {
    func setImage(url : String, placeholder: String, callback : (() -> Void)? = nil){
        self.image = UIImage(named: "no-photo")

        URLSession.shared.dataTask(with: NSURL(string: url)! as URL, completionHandler: { (data, response, error) -> Void in

            guard error == nil else {
                return
            }
            DispatchQueue.main.async(execute: { () -> Void in
                let image = UIImage(data: data!)
                self.image = image
                if let callback = callback{
                    callback()
                }                    
            })

        }).resume()
    }
}

另一个UICollectionView应该出现在此one的上方。我哪里做错了?

应用程序运行图像

编辑,,我正在调试代码,我在这些行上放了一个断点。所以,发生的事情是编译器只是读取"if",而不是进入"else“。

代码语言:javascript
复制
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if self.collectionView.tag == 1 {
        return  self.dataSource.count
    } else {
        return self.dataBanner.count
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-01 12:57:33

代码语言:javascript
复制
getBanner { (data) in
        DispatchQueue.main.async {
        self.dataBanner = data
        self.collectionViewBanner.reloadData()
        }
    }


    getAudiobooksAPI { (data) in
        DispatchQueue.main.async {
            self.dataSource = data
            self.collectionView.reloadData()
        }
    }


   func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if (collectionView == self.collectionView) { 
       return self.dataSource.count 
    }else if (collectionView == self.collectionViewBanner) { 
       return self.dataBanner.count 
    } else { 
       return nil 
    } 
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-01 13:05:13

请使用我的代码,它将解决您的问题

第一个变化

collectionViewBanner.reloadData中的第一个更改

第二个变化

只需检查NumberofiteminSection方法

代码语言:javascript
复制
import UIKit

class ViewController: UIViewController, UICollectionViewDataSource {

    @IBOutlet var collectionView: UICollectionView!
    @IBOutlet weak var collectionViewBanner: UICollectionView!


    var dataSource: [Content] = [Content]()
    var dataBanner: [Banner] = [Banner]()

    override func viewDidLoad() {
        super.viewDidLoad()

        getBanner { (data) in
            DispatchQueue.main.async {
            self.dataBanner = data
            self.collectionViewBanner.reloadData()
            }
        }


        getAudiobooksAPI { (data) in
            DispatchQueue.main.async {
                self.dataSource = data
                self.collectionView.reloadData()
            }
        }
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if (collectionView == self.collectionView) {
        return  self.dataSource.count
        }else{

        return self.dataBanner.count
        }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        if (collectionView == self.collectionView) {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell

        let content = self.dataSource[indexPath.item]

        cell.bookLabel.text = content.descricao
        cell.bookImage.setImage(url: content.urlImagem, placeholder: "")

        return cell

        }else if (collectionView == self.collectionViewBanner) {

            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCellBanner", for: indexPath) as! CollectionViewCell

            let content = self.dataBanner[indexPath.item]

            cell.bannerImage.setImage(url: content.urlImagem, placeholder: "")


            return cell
        }
        return UICollectionViewCell()
    }

}

extension UIImageView{
    func setImage(url : String, placeholder: String, callback : (() -> Void)? = nil){
        self.image = UIImage(named: "no-photo")

        URLSession.shared.dataTask(with: NSURL(string: url)! as URL, completionHandler: { (data, response, error) -> Void in

            guard error == nil else{
                return
            }
            DispatchQueue.main.async(execute: { () -> Void in
                let image = UIImage(data: data!)
                self.image = image
                if let callback = callback{
                    callback()
                }


            })

        }).resume()
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-01 12:54:01

您忘记了重新加载collectionViewBanner.只是

代码语言:javascript
复制
collectionViewBanner.reloadData()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50636230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档