首页 > 解决方案 > Swift 5 UICollectionViewCell 如何改变它的内容

问题描述

我现在很困惑,在 cellForItemAt 方法中,我更改了 label.text 值,但我发现在创建单元格实例后调用了这一行[这里是预览集合视图][1]

let data = self.data[indexPath.item]
cell.myLabel.text = "\(indexPath.row)"
print(cell.myLabel.text)

但是,在我的自定义单元格中,

self.contentView.addSubview(myLabel)
print((myLabel.text)

myLabel 在 init() 中添加到 contentView

我不知道在cellForItemAt中更改myLabel.text如何更新已经添加到contenView的标签,

所以当我试图通过打印我得到的文本来弄清楚时,CUSTOM, 1, CUSTOM, 2, CUSTOM, 3 ...

.... 这意味着 myLabel.text 在添加到 contentView 之前没有更改为 indexPath.row,那么这是怎么发生的?任何人都可以帮助我吗?如果我不明白,我将无法继续我的项目,我被困在这里

这是一些代码

class Cell: UICollectionViewCell {

static var identifier: String = "Cell"

var textLabel: UILabel!

var myLabel: UILabel = {
    let label = UILabel()
    label.text = "CUSTOM"
    label.backgroundColor = .green
    label.textAlignment = .center
    return label
} ()

override init(frame: CGRect) {
    super.init(frame: frame)

    
    self.contentView.addSubview(myLabel)
    
    print(myLabel.text) // print the text after label is added to contentView 
    // I got Optional("CUSTOM") Which was not changed here

}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func layoutSubviews() {
    super.layoutSubviews()
    
    myLabel.frame = CGRect(x: 0, y: 0, width: contentView.frame.size.width - 50, height: 50)
}
}

数据源

extension ViewController: UICollectionViewDataSource {

func collectionView(_ collectionView: UICollectionView,
                    numberOfItemsInSection section: Int) -> Int {
    return self.data.count
}

func collectionView(_ collectionView: UICollectionView,
                    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Cell.identifier, for: indexPath) as! Cell
    let data = self.data[indexPath.item]
    cell.myLabel.text = "\(indexPath.row)" 
    print(cell.myLabel.text) // I got Optional("0"), Optional("1"), Optional("2") .. here
                            // But the label was already added with text "CUSTOM"
    return cell
}
}

标签: swiftuiviewuicollectionviewuiscrollviewuicollectionviewcell

解决方案


首先,.texta 的属性UILabelcan nil,所以它是可选的。

如果将其添加到视图控制器的viewDidLoad()

    let label = UILabel()
    print(label.text)
    label.text = "abc"
    print(label.text)

调试控制台中的输出将是:

nil
Optional("abc")

接下来,如果您设置标签的文本,然后再次设置,它将替换任何现有文本:

    let label = UILabel()
    print(label.text)
    label.text = "abc"
    print(label.text)
    label.text = "1"
    print(label.text)

现在输出是:

nil
Optional("abc")
Optional("1")

如果你想摆脱“可选”部分,你需要解开文本:

    let label = UILabel()
    if let s = label.text {
        print(s)
    }
    label.text = "abc"
    if let s = label.text {
        print(s)
    }
    label.text = "1"
    if let s = label.text {
        print(s)
    }

输出:

abc
1

注意没有“nil”输出......因为第一if let...条语句失败,所以打印语句没有被执行。

因此,如果您希望您的标签显示“CUSTOM 1”/“CUSTOM 2”/“CUSTOM 3”等,您可以将其设置为cellForRowAt

cell.myLabel.text = "CUSTOM \(indexPath.row)"

或者,您可以附加现有文本:

// unwrap the optional text
if let s = cell.myLabel.text {
    cell.myLabel.text = s + " \(indexPath.row)"
}

但是请注意,单元格被重复使用,因此您最终可能会得到:

CUSTOM 1 7 15 8 23

将全文设置为您想要的内容要好得多,而不是每次使用单元格时都尝试附加一些内容。


推荐阅读