2016-09-25 35 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

這不是顯示視圖的代碼的一部分,僅用於僅包含文本的單元格:/但正確地說,我錯過了代碼部分:) –