我正在动态创建一个UITableView并用一个数组填充它,这个数组填充了我的字典。问题是当我在Dictionary中进行一些更改时,相应地重新填充数组并重新加载tableview数据,保留先前的单元格数据,并将新数据写入先前的数据。我尝试了很多变通方法,比如改变方法调用的顺序,在子视图上使用viewWithTag,在再次添加之前从superviews中删除子视图等等。没有工作,因为大多数答案都是旧的并且与“(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作为一个子视图被添加到这个UIView中。乍一看,一切都很棒。当我关闭UIView并重新点击按钮时,此时tableview会加载新数据(也是正确的数据),但它会覆盖以前的数据。在提供的代码中,我知道我没有向数组添加任何数据,但是问题是相同的,例如我在UILabel中写了“Pizza”,当我重新加载表时,仍然有“Pizza”,但是这个时间较暗(告诉我标签在之前的标签上被覆盖)。假设我将“Burger”添加到数组中,tableview显示“Burger”和“Pizza”,但这次“Burger”写在索引0的前一个“Pizza”上,而“Pizza”仅在索引1处。如果没有正确理解,我还可以提供其他信息或一些问题的图片。
答案 0 :(得分:0)
看起来我并不完全理解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
}