我现在很困惑,在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
最好将全文设置成你想要的样子,而不是每次使用单元格时都附加一些东西。