daydr3am3r
daydr3am3r

Reputation: 956

Uncheck UITableview custom checkbox option in Swift

I am trying to make a custom checkbox list using the UITableview that allows single selections (I should however be able to select as many options as I want) and a custom UITableCell.

My custom cell contains a Label and an ImageView and all I want is to change the image contained in the IV on tap.

I am able to change the image from unchecked to checked in my didSelectRowAtIndexPath without a problem but I am having problems changing it back from checked to unchecked.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
    print("tableView -> didSelectRowAtIndexPath")

    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CustomCellVC

    cell.backgroundColor = UIColor.clearColor()
    cell.ivRiskCellImage.image = UIImage(named: "CheckedBox")
}

I tried to play with the highlighted state of the ImageView by adding the checkedbox image as the highlighted image and then turning it on and off but it only enters the if but ignores the if else if clicked again

    if(cell.ivCellImage.highlighted == false)
    {
        print("Highligth is OFF")
        cell.ivCellImage.highlighted = true
    }
    else if(cell.ivCellImage.highlighted == true)
    {
        print("Highligth is ON")
        cell.ivCellImage.highlighted = false
    }

as well as checking what image is inside the IV, this if-else block being completely ignored

    if(cell.ivRiskCellImage.image!.isEqual(UIImage(named: "UncheckedBox")))
    {
        print("Is unchecked!")
        cell.ivRiskCellImage.image = UIImage(named: "CheckedBox")
    }
    else if(cell.ivRiskCellImage.image!.isEqual(UIImage(named: "CheckedBox")))
    {
        print("Is checked!")
        cell.ivRiskCellImage.image = UIImage(named: "UnheckedBox")
    }

Moreover, when I manage to display the checkedbox image on click I get something like this

enter image description here

while if I try setting the checked box for all the cells in cellForRowAtIndexPath by adding this

cell.ivRiskCellImage.image = UIImage(named: "CheckedBox")

the checkbox tick is no longer semitransparent but white, as it should be

enter image description here

Any ideas? I spent quite some time trying to solve this without any luck.

Upvotes: 1

Views: 2369

Answers (2)

vivek agravat
vivek agravat

Reputation: 251

As fat i understand that you want to change image form Check and Uncheck and vice versa

There is mainly two methods of table view delegate

– tableView:didDeselectRowAtIndexPath:
– tableView:didSelectRowAtIndexPath:

reference link : https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView:didDeselectRowAtIndexPath:

Although you can do same thing in – tableView:didDeselectRowAtIndexPath:

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath)
{
    print("tableView -> didSelectRowAtIndexPath")

    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! CustomCellVC

    cell.backgroundColor = UIColor.clearColor()
    cell.ivRiskCellImage.image = UIImage(named: "**unCheckedBox**")
}

Upvotes: 1

Koodimetsa
Koodimetsa

Reputation: 870

Instead of let cell = tableView.dequeueReusableCellWithIdentifier... I would use

let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCellVC

This way you get a reference to the cell you want to change the image in. tableView.dequeueReusableCellWithIdentifier is meant to be used in delegate method tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) when you want to recycle your cells for better performance.

Also cell.ivRiskCellImage.image!.isEqual(UIImage(named: "UncheckedBox")) doesn't work, because UIImage(named: "UncheckedBox") creates a new UIImage, which isn't the same as the UIImage you want to check it against.

Upvotes: 3

Related Questions