D. Finna D. Finna - 2 months ago 12
Swift Question

Views from UITableView disappearing

I have a custom cell that is showing 14 different views. Depending on what data the cell is receiving it should show the views that are equal to the .count of some data, and the color should change depending on what data it is.

For instance:

If it is receiving three types of data, it should only show 3 views. Could be

ice cream, candy, marshmellows
. Then it would show three views, in
orange (ice cream), blue (candy), green (marshmellows)
.

I got that working pretty well and I am excited about it. The problem is, if I have a cell showing three views and scroll down to a cell only containing 1 view (because the data was only one), then when I scroll up to the first cell again that should originally show three views, it is only showing 1, the first one..

I have an example:

My custom cell in storyboard is like this, the green and black boxes are the different views
enter image description here

This is what it looks like with 6 types of data:
enter image description here

When I then scroll down to a cell containing one view, the cell with 6 views will look like this afterwards:

enter image description here

Here is some relevant code:

Let me explain the code. In my database, every post has a category which is either 1 or 2. That is what the code is searching for, in update.category. If it is category 1, then it is just plain text. If it is category 2 ( or something else ) it should show the views, so I actually have to types of cells in my 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
}
}


I hope you understand and that you can help me, as it is pretty annoying :-)

Answer

You have to update all elements for each condition. the cause of your issue: the table view is reusing the cells so if you have a cell showing 5 labels and after scrolling you have another one has a 3 and the other 2 is hidden, when you scroll up again you have to make them visible again a table view is using the one with 2 hidden labels. In CellForRowAtIndexPath add the missing labels in each conditions or in your custom UItableViewCell class add the method prepareForReuseand make all the labels visible.

Comments