当字符串传递给自定义 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 编程。
awakeFromNib
在 view
及其 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
我正在设置一个带有自定义 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 编程。
awakeFromNib
在 view
及其 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