为什么 UITableVIew 滚动后数据显示不正确
Why UITableVIew Display Data Incorrectly After Scrolling
我的代码很简单。我有一个固定的字符串列表要显示在 UITableView 上,带有自定义 UITableViewCell,上面只有一个 UILabel。
我的问题是,虽然数据最初显示正确,但滚动后显示不正确。
这里有更多详细信息。 DataSource 是一个列表 [(String, something_else)]
列表内容为
[("aaaaaa", something),
("bbbbbb", something),
("cccccc", something),
...
("rrrrrr", something)]
屏幕足够大,可以显示“aaaa”到“mmmm”。当我向下滚动时,下一个可见行应该是“nnnn”,但它是“rrrr”,在“rrrr”是“aaaa”、“bbbb”、“cccc”之后,然后我向上滚动,它给了我“eeee” ,“cccc”,“rrrr”。每次重启模拟器都略有不同
正如您在下面的代码中看到的,每次 cell
出列并设置 cell.note
时,我都添加了 print(cell.note)
,但控制台中打印的消息表明单元格设置为正确的音符。是的,它看起来是正确的。在“mmm”之后是n,o,p,q,r,然后我向上滚动,是f,e,d,c,b,a,看起来是正确的。
我不明白为什么,也不知道如何解决。谷歌搜索没有提供任何信息,所以我想尝试在这里寻求帮助。感谢您阅读本文。
下面是我的代码。数据源和委托的非常简单的实现
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
data.count;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableview?.dequeueReusableCell(withIdentifier: "NoteNodeCell") as! NoteNodeCell
cell.note = data[indexPath.row].0
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 64
}
}
NoteNodeCell 是一个自定义的 UITableViewCell。我基本上只在里面加了一个UILabel。
class NoteNodeCell: UITableViewCell {
var note: String {
get { cellView.note }
set { cellView.note = newValue }}
var cellView:CellView = CellView()
override func awakeFromNib() {
super.awakeFromNib()
if cellView.superview != contentView {
contentView.addSubview(cellView)
}
cellView.translatesAutoresizingMaskIntoConstraints = false
cellView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
cellView.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
cellView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
cellView.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
}
override func prepareForReuse() {
super.prepareForReuse()
note = ""
}
}
class CellView: UIView {
var note = "" { didSet { print(note) }}
override func draw(_ rect: CGRect) {
super.draw(rect)
UIColor.white.setFill()
UIRectFill(rect)
let label = UILabel(frame: bounds)
label.text = " " + note
label.font = UIFont(name: "Courier", size: 18)
label.textColor = .white
label.backgroundColor = .gray
label.layer.cornerRadius = 5
label.layer.masksToBounds = true
UIColor.clear.setFill()
addSubview(label)
}
}
再次感谢您阅读本文。
为您的 CellView 试试这个 class
class CellView: UIView {
let label = UILabel()
var note = "" {
didSet {
print(note)
self.label.text = " " + note // this
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setupSubviews()
}
private func setupSubviews() {
label.text = " " + note
label.font = UIFont(name: "Courier", size: 18)
label.textColor = .white
label.backgroundColor = .gray
label.layer.cornerRadius = 5
label.layer.masksToBounds = true
addSubview(label)
}
}
你的 UITableViewCell 需要这个
let cellView = CellView(frame: .zero)
如果这不起作用请告诉我
我的代码很简单。我有一个固定的字符串列表要显示在 UITableView 上,带有自定义 UITableViewCell,上面只有一个 UILabel。
我的问题是,虽然数据最初显示正确,但滚动后显示不正确。
这里有更多详细信息。 DataSource 是一个列表 [(String, something_else)]
列表内容为
[("aaaaaa", something),
("bbbbbb", something),
("cccccc", something),
...
("rrrrrr", something)]
屏幕足够大,可以显示“aaaa”到“mmmm”。当我向下滚动时,下一个可见行应该是“nnnn”,但它是“rrrr”,在“rrrr”是“aaaa”、“bbbb”、“cccc”之后,然后我向上滚动,它给了我“eeee” ,“cccc”,“rrrr”。每次重启模拟器都略有不同
正如您在下面的代码中看到的,每次 cell
出列并设置 cell.note
时,我都添加了 print(cell.note)
,但控制台中打印的消息表明单元格设置为正确的音符。是的,它看起来是正确的。在“mmm”之后是n,o,p,q,r,然后我向上滚动,是f,e,d,c,b,a,看起来是正确的。
我不明白为什么,也不知道如何解决。谷歌搜索没有提供任何信息,所以我想尝试在这里寻求帮助。感谢您阅读本文。
下面是我的代码。数据源和委托的非常简单的实现
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
data.count;
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableview?.dequeueReusableCell(withIdentifier: "NoteNodeCell") as! NoteNodeCell
cell.note = data[indexPath.row].0
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 64
}
}
NoteNodeCell 是一个自定义的 UITableViewCell。我基本上只在里面加了一个UILabel。
class NoteNodeCell: UITableViewCell {
var note: String {
get { cellView.note }
set { cellView.note = newValue }}
var cellView:CellView = CellView()
override func awakeFromNib() {
super.awakeFromNib()
if cellView.superview != contentView {
contentView.addSubview(cellView)
}
cellView.translatesAutoresizingMaskIntoConstraints = false
cellView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
cellView.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
cellView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
cellView.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
}
override func prepareForReuse() {
super.prepareForReuse()
note = ""
}
}
class CellView: UIView {
var note = "" { didSet { print(note) }}
override func draw(_ rect: CGRect) {
super.draw(rect)
UIColor.white.setFill()
UIRectFill(rect)
let label = UILabel(frame: bounds)
label.text = " " + note
label.font = UIFont(name: "Courier", size: 18)
label.textColor = .white
label.backgroundColor = .gray
label.layer.cornerRadius = 5
label.layer.masksToBounds = true
UIColor.clear.setFill()
addSubview(label)
}
}
再次感谢您阅读本文。
为您的 CellView 试试这个 class
class CellView: UIView {
let label = UILabel()
var note = "" {
didSet {
print(note)
self.label.text = " " + note // this
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setupSubviews()
}
private func setupSubviews() {
label.text = " " + note
label.font = UIFont(name: "Courier", size: 18)
label.textColor = .white
label.backgroundColor = .gray
label.layer.cornerRadius = 5
label.layer.masksToBounds = true
addSubview(label)
}
}
你的 UITableViewCell 需要这个
let cellView = CellView(frame: .zero)
如果这不起作用请告诉我