Swift 5 UICollectionViewCell 如何更改其内容



我现在很困惑,在cellForItemAt方法中,我改变了标签。文本值,但我发现这一行是在创建单元格实例后调用的[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

我不知道如何改变myLabel。cellForItemAt中的文本更新已经添加到contentview的标签,

所以当我试图通过打印我得到的文本来找出它时,

…也就是myLabel。text未更改为indexPath。这是怎么发生的呢??有人能帮我吗?如果我不解决这个问题,我就不能继续我的项目,我就被困在这里了

下面是一些代码

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
}
}

首先,UILabel.text属性可以是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")

如果你想去掉"Optional"部分,您需要展开文本:

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...语句失败,所以print语句没有被执行。

如果你想让你的标签显示"CUSTOM 1"/"CUSTOM 2"/"CUSTOM 3"/etc,你可以这样设置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

最好将全文设置成你想要的样子,而不是每次使用单元格时都附加一些东西。

相关内容

最新更新