我动态创建一个 UITableView 并用一个数组填充它,该数组填充我的字典。问题是,当我在字典中进行一些更改、相应地重新填充数组并重新加载表格 View 数据时,以前的单元格数据会保留,新数据会覆盖以前的数据。我尝试了很多解决方法,例如更改方法调用的顺序、在 subview 上使用 viewWithTag、在再次添加之前从 super View 中删除 subview 等。没有一个有效,因为大多数答案都是旧的并且与“(cell == nil)”有关“问题,而我并没有走那条路。这是代码:
var sepetDict: [String: Int] = [:]
var sepetDictCopy = [String]()
override fun viewDidLoad() {
sepetTableView.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width, sepetDialogView.bounds.size.height)
sepetTableView.delegate = self
sepetTableView.dataSource = self
sepetTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "sepetCell")
}
func sepetClick() {
sepetDictCopy.removeAll()
sepetDictCopy = Array(sepetDict.keys)
sepetTableView.reloadData()
sepetTableView.removeFromSuperview()
self.view.addSubview(sepetDialogView)
sepetDialogView.addSubview(sepetTableView)
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let sepetCell = sepetTableView.dequeueReusableCellWithIdentifier("sepetCell", forIndexPath: indexPath)
let sepetNameLabel = UILabel()
sepetNameLabel.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width / 2, 60)
sepetNameLabel.center = CGPointMake(25 + sepetDialogView.bounds.size.width / 4 , 30)
sepetNameLabel.font = sepetNameLabel.font.fontWithSize(13)
sepetNameLabel.numberOfLines = 0
sepetNameLabel.textAlignment = NSTextAlignment.Left
sepetNameLabel.text = sepetDictCopy[indexPath.row]
sepetCell.contentView.addSubview(sepetNameLabel)
return sepetCell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return sepetDictCopy.count
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 60
}
在本例中,我单击一个 UIButton,它会弹出一个 UIView,并且 UITableView 作为 subview 添加到该 UIView 中。第一次点击,一切都很好。当我关闭 UIView 并重新单击按钮时,这次 TableView 会加载新数据(也是正确的数据),但它会覆盖以前的数据。在提供的代码中,我知道我没有向数组添加任何数据,但问题是相同的,因为例如我在 UILabel 中编写了“Pizza”,当我重新加载表格时,仍然有“Pizza”,但是这个时间变暗(这告诉我标签被覆盖在以前的标签上)。假设我将“Burger”添加到数组中,tableview 显示“Burger”和“Pizza”,但这次“Burger”被写在索引 0 处的先前“Pizza”上,而“Pizza”仅位于索引 1 处。如果没有正确理解,我还可以提供更多信息或问题的一些图片。
最佳答案
看来我不太理解viewWithTag方法的概念。我重新排列了我的代码并且它起作用了。对于那些正在寻找最新答案和代码的人,这里是:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var sepetCell: UITableViewCell! = sepetTableView.dequeueReusableCellWithIdentifier("")
if (sepetCell == nil) {
sepetCell = sepetTableView.dequeueReusableCellWithIdentifier("sepetCell")!
let sepetNameLabel = UILabel()
sepetNameLabel.tag = 1
sepetNameLabel.frame = CGRectMake(0, 0, sepetDialogView.bounds.size.width / 2, 60)
sepetNameLabel.center = CGPointMake(25 + sepetDialogView.bounds.size.width / 4 , 30)
sepetNameLabel.font = sepetNameLabel.font.fontWithSize(13)
sepetNameLabel.numberOfLines = 0
sepetNameLabel.textAlignment = NSTextAlignment.Left
sepetCell.contentView.addSubview(sepetNameLabel)
}
let sepetNameLabel = sepetCell.contentView.viewWithTag(1) as! UILabel
sepetNameLabel.text = sepetDictCopy[indexPath.row]
return sepetCell
}
关于swift - UITableView reloadData() 覆盖以前的单元格数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39068820/