2016-09-25 2 views
0

У меня есть пользовательская ячейка, которая отображает 14 разных видов. В зависимости от того, какие данные получает эта ячейка, должны отображаться представления, равные .count некоторых данных, и цвет должен меняться в зависимости от того, какие данные он имеет.Отклонения от UITableView

Например:

Если он получает три типа данных, он должен показывать только 3 вида. Может быть ice cream, candy, marshmellows. Затем он отобразит три вида, в orange (ice cream), blue (candy), green (marshmellows).

У меня это работает очень хорошо, и я в восторге от этого. Проблема в том, что если у меня есть ячейка, показывающая три представления, и прокрутите вниз до ячейки, содержащей только 1 вид (потому что данные были только один), тогда, когда я прокручиваю вверх до первой ячейки снова, которая должна первоначально отображать три вида, это показывает только 1, первый ..

у меня есть пример:

Мой заказ клетка в раскадровке, как это, зеленые и черные ящики разные виды enter image description here

Это то, что это выглядит как 6 типов данных: enter image description here

Когда я затем прокрутите вниз до ячейки, содержащей один вид, клетка с 6 видами будет выглядеть после:

enter image description here

Вот некоторые соответствующий код:

Позвольте мне объяснить код. В моей базе данных каждое сообщение имеет категорию 1 или 2. Это то, что ищет код, в update.category. Если это категория 1, то это просто текст. Если это категория 2 (или что-то еще), она должна отображать представления, поэтому на самом деле у меня есть типы ячеек в моем UITableViewController.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let update = updates[indexPath.row] 

    if update.category == 1 { 

     let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell 

     cell.nameButton.setTitle(update.addedByUser, forState: .Normal) 

     return cell 

    } else { 

     let cellSugar:newSugarTableViewCell = tableView.dequeueReusableCellWithIdentifier("CellSugar", forIndexPath: indexPath) as! newSugarTableViewCell 

     cellSugar.nameButton.setTitle(update.addedByUser, forState: .Normal) 

     let sugarArray = update.content.componentsSeparatedByString("--") 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 

      cellSugar.sugarViewOne.layer.cornerRadius = cellSugar.sugarViewOne.frame.size.width/2 
      cellSugar.sugarViewOne.clipsToBounds = true 
      cellSugar.sugarViewOne.layer.borderColor = UIColor.whiteColor().CGColor 
      cellSugar.sugarViewOne.layer.borderWidth = 2.0 

      cellSugar.sugarViewTwo.layer.cornerRadius = cellSugar.sugarViewTwo.frame.size.width/2 
      cellSugar.sugarViewTwo.clipsToBounds = true 
      cellSugar.sugarViewTwo.layer.borderColor = UIColor.whiteColor().CGColor 
      cellSugar.sugarViewTwo.layer.borderWidth = 2.0 
     }) 


     if sugarArray.count == 1 { 

      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       let seperateSugarArray = sugarArray[0].componentsSeparatedByString("#") 

       if seperateSugarArray[4] == "Candy" { 
        cellSugar.sugarViewOne.backgroundColor = UIColor(red: 97.0/255.0, green: 194.0/255.0, blue: 231.0/255.0, alpha: 1.0) // Blå 

       } else if seperateSugarArray[4] == "Ice cream" { 
        cellSugar.sugarViewOne.backgroundColor = UIColor(red: 35.0/255.0, green: 117.0/255.0, blue: 147.0/255.0, alpha: 1.0) // Mørke grå/blå 

       } else if seperateSugarArray[4] == "Marshmellows" { 
        cellSugar.sugarViewOne.backgroundColor = UIColor(red: 75.0/255.0, green: 212.0/255.0, blue: 159.0/255.0, alpha: 1.0) // Tyrkis 

       } 

       cellSugar.sugarViewTwo.hidden = true 
       cellSugar.sugarViewThree.hidden = true 
       cellSugar.sugarViewFour.hidden = true 
       cellSugar.sugarViewFive.hidden = true 
       cellSugar.sugarViewSix.hidden = true 
       cellSugar.sugarViewSeven.hidden = true 
       cellSugar.sugarViewEight.hidden = true 
       cellSugar.sugarViewNine.hidden = true 
       cellSugar.sugarViewTen.hidden = true 
       cellSugar.sugarViewEleven.hidden = true 
       cellSugar.sugarViewTwelve.hidden = true 
       cellSugar.sugarViewThirteen.hidden = true 
       cellSugar.sugarViewFourteen.hidden = true 
      }) 


     } else if sugarArray.count == 2 { 
      dispatch_async(dispatch_get_main_queue(), {() -> Void in 

       let seperateSugarArray = sugarArray[0].componentsSeparatedByString("#") 
       let seperateSugarArrayTwo = sugarArray[1].componentsSeparatedByString("#") 

       if seperateSugarArray[4] == "Candy" { 
        cellSugar.sugarViewOne.backgroundColor = UIColor(red: 97.0/255.0, green: 194.0/255.0, blue: 231.0/255.0, alpha: 1.0) // Blå 

       } else if seperateSugarArray[4] == "Ice cream" { 
        cellSugar.sugarViewOne.backgroundColor = UIColor(red: 35.0/255.0, green: 117.0/255.0, blue: 147.0/255.0, alpha: 1.0) // Mørke grå/blå 

       } else if seperateSugarArray[4] == "Marshmellows" { 
        cellSugar.sugarViewOne.backgroundColor = UIColor(red: 75.0/255.0, green: 212.0/255.0, blue: 159.0/255.0, alpha: 1.0) // Tyrkis 

       } 

       if seperateSugarArray[4] == "Candy" { 
        cellSugar.sugarViewTwo.backgroundColor = UIColor(red: 97.0/255.0, green: 194.0/255.0, blue: 231.0/255.0, alpha: 1.0) // Blå 

       } else if seperateSugarArray[4] == "Ice cream" { 
        cellSugar.sugarViewTwo.backgroundColor = UIColor(red: 35.0/255.0, green: 117.0/255.0, blue: 147.0/255.0, alpha: 1.0) // Mørke grå/blå 

       } else if seperateSugarArray[4] == "Marshmellows" { 
        cellSugar.sugarViewTwo.backgroundColor = UIColor(red: 75.0/255.0, green: 212.0/255.0, blue: 159.0/255.0, alpha: 1.0) // Tyrkis 

       } 


       cellSugar.sugarViewThree.hidden = true 
       cellSugar.sugarViewFour.hidden = true 
       cellSugar.sugarViewFive.hidden = true 
       cellSugar.sugarViewSix.hidden = true 
       cellSugar.sugarViewSeven.hidden = true 
       cellSugar.sugarViewEight.hidden = true 
       cellSugar.sugarViewNine.hidden = true 
       cellSugar.sugarViewTen.hidden = true 
       cellSugar.sugarViewEleven.hidden = true 
       cellSugar.sugarViewTwelve.hidden = true 
       cellSugar.sugarViewThirteen.hidden = true 
       cellSugar.sugarViewFourteen.hidden = true 


      }) 

     } 

     return cellSugar 
    } 
} 

Я надеюсь, вы понимаете, и что вы можете мне помочь, так как это очень раздражает :-)

+0

@ Mr.UB Я добавил соответствующий код. Часть, которая содержит представления, находится в другой части, а не в if update.category == 1, которая является только ячейкой с текстом. Надеюсь, вы поймете :-) –

+0

Я добавил, что :-) –

+0

'' '' '' if update.category == 1 {'не содержит' return cell'. –

ответ

1

Вы должны обновить все элементы для каждого условия. Причина вашей проблемы: представление таблицы повторно использует ячейки, поэтому, если у вас есть ячейка, показывающая 5 ярлыков, и после прокрутки у вас есть еще одна, а 3, а вторая 2 скрыта, когда вы снова прокручиваете, вы должны сделать их снова видно, что в табличном представлении используется один с двумя скрытыми ярлыками. В CellForRowAtIndexPath добавьте недостающие ярлыки в каждое условие или в свой собственный класс UItableViewCell добавьте метод prepareForReuse и сделайте все наклейки видимыми.

+0

Не могли бы вы показать мне пример с двумя представлениями? Добавление отсутствующих представлений в каждое условие? и как вы используете prepareForReuse? –

+0

Я добавил все взгляды в верхней части части else и установил их в .hidden = false, и это, похоже, сделало это! Так просто, но так сложно - спасибо :-) –

0

UITableView повторное использование ячеек таким образом, что он принимает одну ячейку в текущем состоянии (со всеми ее представлениями) и возвращает эту ячейку для другой строки, для которой вам нужно снова настроить ячейку по мере необходимости.

if update.category == 1 { 

    let cell:updateTableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! updateTableViewCell 
    cell.nameButton.setTitle(update.addedByUser, forState: .Normal) 
    return cell 

} 

Перед тем, как вернуть его, вам необходимо настроить свою ячейку для данных текущей строки.

+0

Это не та часть кода, которая отображает представления, то есть только для ячейки с текстом: /, но правильно я отсутствовал, что часть кода :) –

Смежные вопросы