如何解决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)
在 init() 中将 myLabel 添加到 contentView
我不知道在 cellForItemAt 中更改 myLabel.text 如何更新已经添加到 contenView 的标签,
所以当我试图通过打印我得到的文本来弄清楚时, 自定义,1,自定义,2,自定义,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
的 UILabel
属性可以是 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
将全文设置为您想要的样子比每次使用单元格时都尝试附加内容要好得多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。