swift - 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
}
}
解决方案
首先,.text
a 的属性UILabel
can 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
将全文设置为您想要的内容要好得多,而不是每次使用单元格时都尝试附加一些内容。
推荐阅读
- flutter - 在 Column 小部件中使用 StreamBuilder
- django - 为什么 Django 没有更简单的方式来设置表单字段的样式?
- android - 在 pressRecentApps() 后按包名查找应用程序并单击它
- python - 如何修复纸牌游戏的 for 循环?
- java - 获取 ImageView 的底部坐标?
- matlab - 带有差分方程系统的 ODE45 时间因变量
- python - 使用 Regex 和 Python 测试和提取多行文本
- c# - 有没有办法在 .NET Core / .NET Standard 中生成多语言文档?
- python - 在类的 __iter__ 方法中产生字典键、值对
- python - 从属性中获取值等于