UITableView reloadData()会覆盖以前的单元格数据

时间:2016-08-21 21:00:25

标签: swift uitableview reloaddata reuseidentifier

我正在动态创建一个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处。如果没有正确理解,我还可以提供其他信息或一些问题的图片。

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
}