2016-09-25 56 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我加了相关的代码。包含视图的部分位于else部分,而不是if update.category == 1,它只是一个包含文本的单元格。希望你明白:-) –

+0

我补充说:-) –

+0

如果update.category == 1 {'不包含'return cell','else'的一部分。 –

回答

1

你必须更新每个条件的所有元素。 问题的原因:表格视图重复使用单元格,所以如果你有一个单元格显示5个标签,滚动后你有另一个有3个,另外2个隐藏,当你再次向上滚动时,你必须让它们可见的表格视图正在使用带有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

这不是显示视图的代码的一部分,仅用于仅包含文本的单元格:/但正确地说,我错过了代码部分:) –