Swift 5 UICollectionViewCell 如何改变它的内容
Swift 5 How UICollectionViewCell changes it's content
我现在很困惑,在 cellForItemAt 方法中,我更改了 label.text 值,但我发现这行是在创建单元格实例后调用的
[这里是预览合集视图][1]
let data = self.data[indexPath.item]
cell.myLabel.text = "\(indexPath.row)"
print(cell.myLabel.text)
但是,在我的自定义单元格中 class,
self.contentView.addSubview(myLabel)
print((myLabel.text)
myLabel 在 init() 中添加到 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
}
}
首先,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")
如果你想去掉“可选”部分,你需要展开文本:
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
将全文设置为您想要的内容比每次使用单元格时都尝试附加内容要好得多。
我现在很困惑,在 cellForItemAt 方法中,我更改了 label.text 值,但我发现这行是在创建单元格实例后调用的 [这里是预览合集视图][1]
let data = self.data[indexPath.item]
cell.myLabel.text = "\(indexPath.row)"
print(cell.myLabel.text)
但是,在我的自定义单元格中 class,
self.contentView.addSubview(myLabel)
print((myLabel.text)
myLabel 在 init() 中添加到 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
}
}
首先,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")
如果你想去掉“可选”部分,你需要展开文本:
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
将全文设置为您想要的内容比每次使用单元格时都尝试附加内容要好得多。