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

标签 swift uitableview reloaddata reuseidentifier

我动态创建一个 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/

相关文章:

ios - 将 UIImageView 添加到 UINavigation 栏而不是导航 Controller 中

ios - 如何在关闭 UIViewController 后重新加载 tableView

ios - UICollectionView重新加载数据问题

Swift重写静态方法编译报错

ios - 从 dateFromString 到 stringFromDate

ios - 具有两个动态高度 UILabel 的自调整单元格

iphone - 如何获取TableView中同一组的所有行

iphone - 防止编辑模式下 UITableView 中的某个部分缩小动画?

IOS - reloadData 有多贵?

Swift Xcode 使用复选框子类将操作附加到复选框