将字符串传递给自定义类时,在 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】:

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

在您的情况下,当awakeFromNib 被调用时,您的buttonText 字符串为nil,而当willDisplay cell 方法调用您正在设置字符串值buttonTextawakeFromNib 在此之前已被调用,因此设置@987654332 @那里不会更新你的label的值。

来自awakeFromNib上的文档:

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

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

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

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

【讨论】:

以上是关于将字符串传递给自定义类时,在 UICollectionViewCell 中设置标签文本不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch:如何将 jobParameters 传递给自定义 bean?

如何将 UIViewController 实例传递给自定义 UITableCell

将 MongoTemplate 传递给自定义存储库实现

将 HTML 传递给自定义组件

Angular 2+将指令传递给自定义组件

如何将参数值传递给自定义 NSLOG