我已经全方位解决了这个问题,但我找不到正确的方法来做自己想做的事。
我向您解释了这个问题:我需要管理6种类型的具有自己设计的单元。例如,我有一个这样的枚举:
enum state {
case buy
case select
case go
case waiting
case work
case ended
}
我有一个数据源,它是构建单元所需的数据数组。该数组始终在我的代码中更新,我希望该数组定义顺序以及tableView中的单元格显示。
在使用一个单元格并使用switch
函数中的state
中的cellForRowAt
显示我需要的设计之前。但是问题是重用系统会将我替换的旧单元格保留在缓存中。
问题:就我而言,我有时需要显示2个单元格,其状态为[选择,购买],然后在第1行中插入单元格[go]-> [选择,购买,购买...],然后添加2这样的行[选择,执行,执行,结束,购买]。我希望我不会表现得太差。
但是,当我这样做时,旧单元的设计仍保留在这里。
所以我的问题是:做到这一点的最佳方法是什么?
感谢您的回复
编辑:这是我尝试过的:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return user.lobbySurvey.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier:"Celll", for: indexPath) 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.stateSurvey
switch surveyState{
case .selectPicture:
cell.drawCard(statutOfCard: .selectPicture)
case .goSurvey:
cell.drawCard(statutOfCard: .goSurvey(picture: survey.picture))
case .surveyEnded:
print("survey Ended")
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(bigView : self.view))
}
}
}
return cell
}
我的功能绘图卡是一个像这样的功能进行重定向的开关:
func drawGoSurvey(image: UIImage){
if(cardIsDraw == false){
widthOfCard = UIScreen.main.bounds.size.width - (widthMarginConstraint*2)
cardViewHeightCon.constant = widthOfCard!*ratioOfImage
goSurvey.draw(countUserSurvey: user.surveyCount, cardView: self.cardView, widthOfCard : widthOfCard!, userPicture: image)
goSurvey.delegate = self
self.addCardShadow()
cardIsDraw = true
}
}
答案 0 :(得分:1)
您似乎正在尝试设置每个单元格,而应该只为该特定indexPath设置单元格。表格视图的工作方式是确定需要显示多少个单元格,然后为需要渲染的多个单元格调用tableView(_:, cellForRowAt:)
。
要解决您的问题,您将需要做一些更接近此的事情:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier:"Cell", for: indexPath) as! CardCell
let state = user.lobbySurvey[indexPath.row]
switch state {
case .selectPicture:
// Customize for select picture
case .goSurvey:
// Customize for goSurvey
case .surveyEnded:
// Customize for surveyEnded
case .surveyWork:
// Customize
case .surveyWaiting:
// Customize
case .buyStack:
// Customize
}
return cell
}