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

Setting label text in a UICollectionViewCell not working when string is passed to custom class

我正在设置一个带有自定义 UICollectionViewCell 的 UICollectionView Class。

使用 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] 
}

但是;

我最初在 KeypadButtonCollectionViewCell Class 中使用 buttonText class 变量进行了不同的设置(如下所示),并在 [=15] 中设置了该变量=] 函数(也在下方)

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] 
}

我误解了什么?为什么它不喜欢设置使用分配的 class 变量来设置 wakeFromNib() 方法中的标签文本,但是当我直接设置标签文本时却起作用了?

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

awakeFromNibview 及其 subviews 被分配和初始化后自动调用,所以不要显式调用它。所以删除行 cell.awakeFromNib().

在您的情况下,当调用 awakeFromNib 时,您的 buttonText 字符串是 nil 并且当 willDisplay cell 方法调用时您正在设置字符串值 buttonText 但是awakeFromNib 在此之前已经被调用,因此设置 buttonText 不会更新您的 label 的值。

来自 awakeFromNib 上的文档:

The nib-loading infrastructure sends an awakeFromNib message to each object recreated from a nib archive, but only after all the objects in the archive have been loaded and initialized. When an object receives an awakeFromNib message, it is guaranteed to have all its outlet and action connections already established.

通过将数组元素直接设置为标签的文本,您使用第一种方法的方式是完美的,但是如果您想设置字符串值 buttonText 那么您可以进行观察 属性 didSet 你的 buttonText 喜欢这样。

var buttonText: String = "" {
    didSet {
        buttonLabel.text = buttonText
    }
}

现在,当您在 willDisplay cell 中设置 buttonText 值时,它将更新单元格标签的值,因为您的 buttonText.

didSet