动态单元格创建tableView的方法及程序设计

时间:2018-10-31 03:26:12

标签: ios swift uitableview

我已经全方位解决了这个问题,但我找不到正确的方法来做自己想做的事。

我向您解释了这个问题:我需要管理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
    }
}

1 个答案:

答案 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
}