如何使自定义collectionview单元格可见?

时间:2018-02-07 20:02:19

标签: ios swift uicollectionview uicollectionviewcell

我似乎无法使我的自定义collectionView Cell可见。我知道CollectionView显示,因为我更改了属性检查器上的背景颜色,但自定义单元格没有显示。我在属性检查器中设置了约束,并在图像下面有一个水平堆栈视图。

我完全遵循了Udemy课程的指示,但它似乎并不起作用。这就是我配置单元格的方式:

Image

代码如下:

Client

以下是ProductCell实现:

import UIKit

class ListVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var productsCollection: UICollectionView!

    private(set) public var products = [Product]()

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

        productsCollection.dataSource = self
        productsCollection.delegate = self
    }

    func initProducts(Product: Product) {
        products = DataService.instance.getGroceryOptions()
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return products.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ProductCell", for: indexPath) as? ProductCell {
            let product = products[indexPath.row]
            cell.updateViews(product: product)
            return cell
        }
        return ProductCell()

    }
}

以下是DataService实现:

class ProductCell: UICollectionViewCell {
    @IBOutlet weak var itemImage: UIImageView!
    @IBOutlet weak var productName: UILabel!
    @IBOutlet weak var productPrice: UILabel!
    @IBOutlet weak var calCount: UILabel!

    func updateViews(product: Product){
        itemImage.image = UIImage(named: product.imageName)
        productName.text = product.title
        calCount.text = product.cal
        productPrice.text = product.price
    }

}

以下是产品实施:

class DataService {
    static let instance = DataService()

    private let item = [
        Product(title: "Eggs", price: "4.94", imageName: "eggs.jpeg", cal: "340"),
    ]

    private let Groceries = [Product]()

    func getGroceryOptions() -> [Product] {
        return Products
    }
}

3 个答案:

答案 0 :(得分:1)

1)您的initProducts方法不会在代码中的任何位置调用。

2)更新数据源后,您必须致电collectionView.reloadData()。这意味着,您必须在更新products属性后调用此方法。

3)另外,正如其他人提到的答案所示,您的getGroceryOptions()方法实际应该返回items而不是Products(那是什么,顺便说一下?)

4)请按照swift样式指南编写代码。您可以更容易地将类/结构与变量区分开来。您可以详细了解here以及here

答案 1 :(得分:0)

未调用initProducts方法。由于此products数组保持为空,您在集合中看不到任何单元格。

您应该致电initProducts(例如在viewDidLoad中)填充products数组,其中包含将在您的收藏中显示的元素。

另请考虑从此功能中删除参数(您在此方法中不使用参数,因此您不需要此参数)。它应该看起来像:

func initProducts() {
        products = DataService.instance.getGroceryOptions()
}

另外,您应该更正getGroceryOptions方法。如评论中所指出的,它应该返回item

答案 2 :(得分:0)

你有numberOfSectionsInCollectionView部分超越其他collectionView功能吗?

看一下这个例子:

func numberOfSectionsInCollectionView(collectionView:UICollectionView) -> Int {
    return 1
}