如何将值传递给自定义UICollectionViewCell?

时间:2016-05-17 21:19:37

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewdelegate

我有一个自定义的UICollectionViewCell,我试图从我的视图控制器传递一个值。我能够将图像传递给单元格,但是在初始化时其他任何东西都没有。

View Controller中的相关代码:

override func viewDidLoad() {

    self.collectionView!.registerClass(MyCustomCell.self, forCellWithReuseIdentifier: "Cell")

}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCustomCell

    cell.someValue = 5
    cell.imageView.image = UIImage(named: "placeholder.png")

    return cell

}

在自定义单元格类中:

var someValue: Int!
var imageView: UIImageView!

override init(frame: CGRect) {

    super.init(frame: frame)

    imageView = UIImageView(frame: CGRectMake(0, 0, frame.width, frame.height))
    contentView.addSubview(imageView)

    let someValueLabel = UILabel()
    someValueLabel.frame = CGRectMake(0, 75, 200, 30)
    someValueLabel.text = "Value is: \(someValue)"
    self.addSubview(someValueLabel)
}

图像从UICollectionView成功传递,我可以显示它,但'someValue'总是为零。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

init方法在构造单元格对象时,在dequeue进程内 - 比您想象的要早得多。初始化过程的一部分是附加在Storyboard中设计的UIViews。因此,图像有效,因为UIImageView在故事板(NIB)加载过程中已作为容器存在,并且您稍后只是设置其内部图像属性。

在单元格渲染和事件处理期间,您已为所有 future 使用正确设置someValue的值。因此,例如,如果在显示和点击单元格后运行的@IBAction处理程序,它确实可以访问someValue。那是您的测试打印应该去的地方。你最终使用 someValue做什么?

<强>后续

所以这是一个简单的错误;你只需要在cellForRowAtIndexPath中设置文本值。您不需要单元格中的模型数据副本(即,您的单元格中不需要someValue字段)。只需从(正确分离的)模型数据中动态配置UI:

而不是:

cell.someValue = 5

你只需要,例如:

cell.someValueLabel.text = "\(indexPath.row)" // or where ever you're getting your underlying model data from

使用init来解决这个问题是一种误解。 init表单元的唯一责任是分配内存。单元格是一个完全动态的临时对象,必须在cellForRowAtIndexPath方法中设置反映应用程序数据的所有属性。单元格的可视化渲染等待cellForRowAtIndexPath方法完成,因此没有计时问题。

答案 1 :(得分:1)

在实例化UICollectionView时调用Init方法。你在init方法中记录了“someValue”,这太早了。由于您正在直接使用已经实例化的ImageView,因此呈现图像。尝试在init方法中记录imageView.image,它也应该是nil(或者可能不是nil,因为该单元格被重用)。

你应该在自定义变量setter和getter中完成你的工作,你可以确定它们不是nil。

var someValue: Int!{
    didSet {
        print("Passed value is: \(newValue)")
    }
}

答案 2 :(得分:0)

您在初始化单元格后设置someValue的值。

您正在初始化过程中调用print("Passed value is: \(someValue)")

在单元类的init方法上设置断点。在将值5赋给该变量之前,您应该看到它通过那里。