Search code examples
iosiphoneuitableviewswiftcustom-cell

Subview in cell loses color when tableview is changing


I have an UITableView which has a dynamic subview.

When the table is static it looks like this: enter image description here The round view with the T is the custom subview

But when I choose edit and drag the table cell the it looses it's color and the T.

enter image description here

Whats the reason for this?

I initialize the cell like this (It's an prototype IB Cell):

    func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) {
        let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as Item
        //cell.textLabel.text = object.valueForKey("name")!.description
        let cSubView = cell.viewWithTag(100) as RoundedIcon
        cSubView.setUpViewWithFirstLetter(String(first(object.name)!).uppercaseString)
    }

And the RoundedIcon works like this:

override init(frame: CGRect) {
    super.init(frame: frame)
    self.layer.cornerRadius = self.frame.size.width / 2;
    self.layer.borderWidth = 1.0;
    self.layer.borderColor = UIColor.lightGrayColor().CGColor;
    self.clipsToBounds = true;
}

func setUpViewWithFirstLetter(letter:String){
        self.backgroundColor = RoundedIcon.UIColorFromRGB(0x68C3A3)
        let theLetterLabel = UILabel()
        theLetterLabel.text = letter
        theLetterLabel.textColor = UIColor.whiteColor()
        theLetterLabel.textAlignment = .Center
        theLetterLabel.font = UIFont.systemFontOfSize(25)
        self.addSubview(theLetterLabel)
        theLetterLabel.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: self.frame.size)
    }

Solution

  • @rdelmar's comment pointed me in the right direction that an UITableview changes the background color of all it's cells to:

    UIColor(white:0,alpha:0)
    

    If you don't want your view to change it's color you should change the backgroundColor property setter, which works in swift like this:

    //override this setter to avoid color resetting on drag
    override var backgroundColor:UIColor?{
        didSet {
            //check the color after setting - you also can do it earlier
            if let bgCol = backgroundColor{
                println(bgCol)
                if bgCol == UIColor(white: 0, alpha: 0){ //check if it's settled by the table
                    super.backgroundColor = yourColor //set it back to your color
                }
            }
        }
    }