使用Collectionview在自定义单元格上使用协议重新加载数据?

时间:2018-01-12 17:47:23

标签: ios swift uicollectionview uicollectionviewcell

我在这里尝试了一堆没有运气的答案。

我试图在从firebase获取数据后在我的自定义单元格中重新加载我的collectionview。我甚至无法从自定义单元格中显示print语句。不知道我做错了什么。

在我的ViewController上,我有以下委托和调用,我做了一个按钮来测试我的自定义单元格上的委托打印语句是否会出现但没有运气。

protocol DiscoverControllerDelegate {
func didFetchData()
}

class DiscoverController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

let cellId = "cellId"
let headerId = "headerId"
let database = FirebaseData.sharedInstance
var delegate: DiscoverControllerDelegate?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    title = "Discover"
    collectionView?.backgroundColor = .white
    collectionView?.register(CategoriesCell.self, forCellWithReuseIdentifier: cellId)
    collectionView?.register(HeaderCell.self, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: headerId)
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Refresh", style: .plain, target: self, action: #selector(reloadData))
    database.retrieveData {
        print("fetching data")
        self.delegate?.didFetchData()
    }

}

@objc func reloadData () {
    print("attemping to reload")
   self.delegate?.didFetchData()
}

*编辑以添加我的覆盖init 在我的自定义单元格上:

class CategoriesCell: UICollectionViewCell, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, DiscoverControllerDelegate  {

let itemCollectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .horizontal
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.backgroundColor = .clear

    return collectionView
}()

func didFetchData() {
    print("RELOADING NOW!")
    itemCollectionView.reloadData()
}

override init(frame: CGRect) {
    super.init(frame: frame)

    itemCollectionView.dataSource = self
    itemCollectionView.delegate = self
    itemCollectionView.register(ItemCell.self, forCellWithReuseIdentifier: cellId)
    itemCollectionView.reloadData()

    createLayout()

}

2 个答案:

答案 0 :(得分:1)

这里有很多不妥之处。 "RELOADING NOW!"永远不会记录的原因是因为您从未在视图控制器中设置委托。如果您在self.delegate中检查DiscoverController,则可能为零。但是,你现在的整个设置似乎都有缺陷,除非我误解了你在做什么。

您的用户界面是什么样的?为什么CategoriesCell拥有UICollectionView属性?它的itemCollectionView属性甚至没有数据源或委托集,而且它不是@IBOutlet,而是在它上面调用reloadData()。不确定它甚至显示什么或者你要做什么。

我觉得这里可能有很多错误而不仅仅是一件事。您可能希望通过一些UITableViewUICollectionView教程来了解iOS中的委托和数据源。

答案 1 :(得分:0)

我不知道集合视图,但我使用类似的协议结构和表视图。他们并没有太大的不同。您的协议应该在不在控制器中的单元类中。 我已经完成了以下帖子中的表格视图的步骤:

Firebase update

也许你可以根据自己的需要调整它......