TableView问题与重用系统和程序设计有关

时间:2018-10-30 11:30:52

标签: ios swift uitableview

我的单元格有问题,我要删除/插入tableView,然后像这样删除和插入单元格:

self.tableView.beginUpdates()
user.lobbySurvey.remove(at: 0)
self.tableView.deleteRows(at: [IndexPath(row: 0, section: 0)], with: .fade)
self.tableView.endUpdates()

插入:

self.tableView.beginUpdates()
user.lobbySurvey.insert(surveyEnded, at: rowToInsert)
self.tableView.insertRows(at: [IndexPath(row: rowToInsert, section: 0)], with: .fade)
self.tableView.endUpdates()

lobbySurvey是TableView的数据数组。 问题是我添加的单元格保留了我之前删除的第一个单元格的设计。

我认为这个问题是因为我检查卡片是否被抽签。如果未选中:每次重复使用单元时,都会添加卡的视图。 这就是我检查单元格是否绘制的方法:

func drawSurveyEnded(){
    if(cardIsDraw == false){
        surveyEnded.draw(cardView: self.cardView)
        surveyEnded.delegate = self
        self.addCardShadow()
        cardIsDraw = true
    }
}

该函数被多次调用导致iOS的重用系统。所以我认为我的问题出在这里。

为什么我在tableView中的单元格保留了我删除的上一个单元格的设计?

感谢您的回复

其他代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier:"Celll") as! CardCell
for survey in user.lobbySurvey{
    let index = user.lobbySurvey.index(where: {
        //get the current index is nedeed else the cells reuse lazy
        $0 === survey
    })
    if indexPath.row == index{
        var surveyState : UserSurvey.state
        surveyState = survey.state
        switch surveyState{
        case .selectSurvey:
            cell.drawCard(statutOfCard: .selectSurvey)
        case .goSurvey:
            cell.drawCard(statutOfCard: .goSurvey(picture: survey.picture))
        case .surveyEnded:
            cell.drawCard(statutOfCard: .surveyEnded(picture: survey.picture))
        case .surveyWork:
            print("survey in progress to vote")
        case .surveyWaiting:
            cell.drawCard(statutOfCard: .surveyWaiting(selfSurveyId: survey.id, timeLeft: survey.timeLeft, picture: survey.picture))
        case .buyStack:
            cell.drawCard(statutOfCard: .buyStack(supView : self.view))
        }
    }
}

cell.delegate = self
cell.delegateCard = self
cell.layer.backgroundColor = UIColor.clear.cgColor
cell.backgroundColor = .clear
tableView.backgroundColor = .clear
tableView.layer.backgroundColor = UIColor.clear.cgColor
return cell
}

抽奖卡是调查状态的一个简单开关,称为“好功能”,可以像我之前发布的这样创建卡:drawSurveyEnded

2 个答案:

答案 0 :(得分:1)

在CardCell中,您必须实现prepareForReuse并从那里清理单元格的视图。因此,当回收单元时,会将它们从以前绘制的视图中清除掉。

答案 1 :(得分:0)

您应该实现:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // Update the cell here
}

这样,您可以确保随时准备显示该单元格,然后对其进行更新。 请记住,UIKit框架为单元保留了缓存,因此可以重复使用它们。