将字符串传递给自定义类时,在 UICollectionViewCell 中设置标签文本不起作用
Posted
技术标签:
【中文标题】将字符串传递给自定义类时,在 UICollectionViewCell 中设置标签文本不起作用【英文标题】:Setting label text in a UICollectionViewCell not working when string is passed to custom class 【发布时间】:2017-02-03 23:42:37 【问题描述】:我正在使用自定义 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]
但是;
我最初在KeypadButtonCollectionViewCell
类(如下所示)中使用buttonText
类变量设置它并在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】:awakeFromNib
在view
及其subviews
被分配和初始化后被自动调用,所以不要显式调用它。所以删除cell.awakeFromNib()
这一行。
在您的情况下,当awakeFromNib
被调用时,您的buttonText
字符串为nil
,而当willDisplay cell
方法调用您正在设置字符串值buttonText
但awakeFromNib
在此之前已被调用,因此设置@987654332 @那里不会更新你的label
的值。
来自awakeFromNib
上的文档:
nib 加载基础架构向从 nib 存档重新创建的每个对象发送 awakeFromNib 消息,但前提是存档中的所有对象都已加载和初始化。 当一个对象收到一个 awakeFromNib 消息时,它保证已经建立了它的所有出口和动作连接。
通过将数组元素直接设置为标签的文本,您使用第一种方法的方式非常完美,但是如果您想设置字符串值 buttonText
,那么您可以使用 @987654337 的观察属性 didSet
@像这样。
var buttonText: String = ""
didSet
buttonLabel.text = buttonText
现在,当您在willDisplay cell
中设置buttonText
值时,它将更新单元格标签的值,因为您的buttonText
的didSet
。
【讨论】:
以上是关于将字符串传递给自定义类时,在 UICollectionViewCell 中设置标签文本不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Batch:如何将 jobParameters 传递给自定义 bean?