-1

我正在使用自定义 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] 
}

然而;

我最初用ClassbuttonText中的一个类变量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 编程。

4

1 回答 1

1

awakeFromNib在分配和初始化之后自动调用viewsubviews,所以不要显式调用它。所以删除线 cell.awakeFromNib()

在您的情况下,何时awakeFromNib调用您的buttonTextStringnil以及何时willDisplay cell调用您正在设置 String 值buttonTextawakeFromNib在此之前已被调用的方法调用,因此设置buttonText不会更新您的label.

从文档中awakeFromNib

nib 加载基础架构向从 nib 存档重新创建的每个对象发送 awakeFromNib 消息,但前提是存档中的所有对象都已加载和初始化。当一个对象收到一个 awakeFromNib 消息时,它保证已经建立了它的所有出口和动作连接。

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

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

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

于 2017-02-04T05:04:04.787 回答