Метод создания tableView с динамической ячейкой и программным дизайном - PullRequest
0 голосов
/ 31 октября 2018

Я вернул проблему во всех направлениях и не могу найти правильный способ сделать то, что хочу.

Я объясняю вам проблему: мне нужно управлять 6 типами ячеек, которые имеют свой собственный дизайн. например у меня есть такое перечисление:

enum state {
    case buy
    case select
    case go
    case waiting
    case work
    case ended
}

У меня есть источник данных, который представляет собой массив данных, необходимых для построения ячейки. Этот массив всегда обновляется в моем коде, и я хочу, чтобы массив определял порядок и отображение ячейки в tableView.

Прежде чем использовать одну ячейку и отобразить нужный мне дизайн с switch из state в функции cellForRowAt. Но проблема заключается в системе повторного использования, которая хранит в кэше мою старую ячейку, которую я заменил.

Проблема: в моем случае мне нужно иногда отображать 2 ячейки с состоянием [выбрать, купить] и после вставки ячейки [идти] в строке 1 -> [выбрать, пойти, купить] ... и после добавления 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
}

Моя функция drawcard - это переключатель, который перенаправляет функцию такого типа:

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 голосов
/ 31 октября 2018

Вы, кажется, пытаетесь настроить каждую ячейку, когда вместо этого настраиваете ячейку только для этого конкретного 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...