我正在使用自定义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编程。
答案 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}},它会更新单元格标签的值。