将字符串传递给自定义类时,在UICollectionViewCell中设置标签文本不起作用

时间:2017-02-03 23:42:38

标签: ios swift swift3 uicollectionviewcell uicollectionviewdelegate

我正在使用自定义UICollectionViewCell类设置UICollectionView。

使用UICollectionViewDelegate中指定的函数,我已经能够在每个单元格中获得一个填充了文本的标签。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "keypadButton", for: indexPath) as! KeypadButtonCollectionViewCell
    cell.awakeFromNib()
    return cell
}


func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    let button = cell as! KeypadButtonCollectionViewCell

    //Assigning like this works
    button.buttonLabel.text = tempScale[indexPath.row] 
}

然而;

我最初使用buttonText类中的KeypadButtonCollectionViewCell类变量(如下所示)设置不同,并在willDisplay函数中设置该变量(也在下面)

class KeypadButtonCollectionViewCell: UICollectionViewCell {


    var buttonLabel: UILabel!
    var buttonText: String!

    override func awakeFromNib() {
        buttonLabel = UILabel.init(frame: contentView.frame)
        buttonLabel.font = UIFont.init(name: "HelveticaNeue-Ultralight", size: 20)
        buttonLabel.textColor = UIColor.black
        buttonLabel.textAlignment = NSTextAlignment.center

        buttonLabel.text = buttonText //Assigning here didn't work

        contentView.layer.borderColor = UIColor.init(red: 37/255, green: 37/255, blue: 37/255, alpha: 1).cgColor
        contentView.layer.borderWidth = 4
        contentView.addSubview(buttonLabel)

    }

}


//---------In the view controller--------

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    let button = cell as! KeypadButtonCollectionViewCell

    //Setting class var string here to be set as label.text not working
    button.labelText = tempScale[indexPath.row] 
}

我在这里误会是什么?为什么不喜欢设置使用指定的类变量来设置wakeFromNib()方法中的标签文本,但是在我直接设置标签文本时有效?

正如开头所提到的,我有一种工作方式,我对学术界感兴趣并更好地理解OOP编程。

1 个答案:

答案 0 :(得分:1)

awakeFromNib及其view被分配和初始化后,会自动调用

subviews,因此请勿明确调用它。因此,请删除行cell.awakeFromNib()

在您调用awakeFromNib的情况下,buttonText字符串为nil,而willDisplay cell方法调用时,您要设置字符串值buttonText但{{{之前已经调用过1}},因此设置awakeFromNib时不会更新buttonText的值。

来自awakeFromNib的文档:

  

nib-loading基础结构将awakeFromNib消息发送到从nib归档重新创建的每个对象,但只有在归档中的所有对象都已加载并初始化之后。 当对象收到awakeFromNib消息时,保证已建立所有插座和操作连接。

通过将数组元素直接设置为标签的文本,您使用第一种方法的方式是完美的,但如果您想设置字符串值label,那么您可以选择观察属性{ {1}} buttonText就像这样。{/ p>

didSet

现在,当您在buttonText中设置var buttonText: String = "" { didSet { buttonLabel.text = buttonText } } 值时,由于buttonText的{​​{1}},它会更新单元格标签的值。