UItableviewcell Checkmark to be toggled on and off when tapped SWIFT

I’m working on a tableview

I want to be able to tap on each cell and when tapped, it displays a checkmark on the cell

  • Using background view for UITableViewCell in iOS 7 covers default delete button
  • How do I dynamically resize a static UITableViewCell?
  • Pushing to a Detail View from a Table View Cell using Xcode Storyboard
  • UITableView is getting a gap on top
  • Getting Data From all TableViewCells
  • Swift: retrieving text from a UITextField in a custom UITableViewCell and putting it in an array
  • now i have some code that makes this work :

    // checkmarks when tapped
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let section = indexPath.section
        let numberOfRows = tableView.numberOfRowsInSection(section)
        for row in 0..<numberOfRows {
            if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: row, inSection: section)) {
                cell.accessoryType = row == indexPath.row ? .Checkmark : .None
            }
        }
    }
    

    but this code only selects 1 cell inside a section (I have 5 sections)

    I need it to select any cell anywhere

    Also when i drag my screen up and down I lose by checkmark

    any help would be really appreciated

    viewcontroller.swift

    class ViewController: UIViewController, UITableViewDataSource {                        //class and subclass                  |)
    //---------------------------------------------------------------------------------------------------------------------------/
        // Variable and constant, also IBAOutlet
    
        let section1 =
           ["this is used",
            "this is used to test",
            "this is used to test the lenght",
            "this is used to test the lenght of the text",
            "this is used to test the lenght of the text",
            "this is used to test the lenght of the text",
            "this is used to test the lenght of the text",
            "this is used to test the lenght of the text",
            "this is used to test the lenght of the text",]
        let section2 =
           ["this is used to test the lenght of the text"]
        let section3 =
           ["this is",
            "this is ",]
    
    
        @IBOutlet weak var scoreshow: UILabel!
        @IBOutlet weak var reset: UIButton!
        @IBOutlet weak var tableView: UITableView!
    
    // --------------------------------------------------------------------------------------
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func didReceiveMemoryWarning() {
    
            super.didReceiveMemoryWarning()
        }
    //----------------------------------------------------------------------------------------
        // checkmarks when tapped
    
        func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
        {
            if let cell = tableView.cellForRowAtIndexPath(indexPath) {
                if cell.accessoryType == .Checkmark
                {
                    cell.accessoryType = .None
                }
                else
                {
                    cell.accessoryType = .Checkmark
                }
            }    
        }
    //----------------------------------------------------------------------------------------
        //number of sections for the table
    
        func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return 5
        }
    //----------------------------------------------------------------------------------------
        //Calculate the amount of rows
    
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
        {
            return self.section1.count;
        }
    //----------------------------------------------------------------------------------------
        //Cells text label and config
    
        func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
        {
            let cell:UITableViewCell = UITableViewCell(style:UITableViewCellStyle.Default, reuseIdentifier:"cell")
            cell.textLabel!.text = section1[indexPath.row]
            cell.textLabel!.numberOfLines = 0
    
            return cell
        }
    
    //----------------------------------------------------------------------------------------
    
        @IBAction func resetswitch(sender: UIButton) {
    
    
    
    
        }
    //----------------------------------------------------------------------------------------
    
    }
    

    5 Solutions Collect From Internet About “UItableviewcell Checkmark to be toggled on and off when tapped SWIFT”

    I solved by using two Swift functions: the didSelectRowAtIndexPath and the didDeselectRowAtIndexPath.

    override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
        if let cell = tableView.cellForRowAtIndexPath(indexPath) {
            cell.accessoryType = .None
        }
    }
    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if let cell = tableView.cellForRowAtIndexPath(indexPath) {
            cell.accessoryType = .Checkmark
    
        }
    }
    

    To make this work properly, add a line of code to your cellForRowAtIndexPath function to select a row when the table view is drawn on the screen, otherwise the didDeselectRowAtIndexPath will not be called the first time you select another row. Like so:

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cellData", forIndexPath: indexPath) 
        if (some condition to initially checkmark a row)
            cell.accessoryType = .Checkmark
            tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: UITableViewScrollPosition.Bottom)
        } else {
            cell.accessoryType = .None
        }
    
        return cell
    }
    

    Try this:

    var checked = [Bool]() // Have an array equal to the number of cells in your table
    
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell
    
        //configure you cell here.
        if !checked[indexPath.row] {
            cell.accessoryType = .None
        } else if checked[indexPath.row] {
            cell.accessoryType = .Checkmark
        }
        return cell
    }
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if let cell = tableView.cellForRowAtIndexPath(indexPath) {
            if cell.accessoryType == .Checkmark {
                 cell.accessoryType = .None
                 checked[indexPath.row] = false
            } else {
                 cell.accessoryType = .Checkmark
                 checked[indexPath.row] = true
            }
        }    
    }
    

    To reset all the checkboxes:

    func resetChecks() {
       for i in 0.. < tableView.numberOfSections {
           for j in 0.. < tableView.numberOfRowsInSection(i) {
                if let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: j, inSection: i)) {
                   cell.accessoryType = .None
                }
           }
       }
    }
    

    Swift 3.0

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.accessoryType = .checkmark
        }
    }
    
    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        if let cell = tableView.cellForRow(at: indexPath) {
            cell.accessoryType = .none
        }
    }
    

    A UITableView keeps selected state for single or multiple selections. So IMO there would need to be a very good reason for keeping an entire parallel state somewhere. If you want to just change the cell’s appearance based on select state, do it in the cell.

    In your UITableViewCell subclass, override setSelected like so:

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        self.accessoryType = selected ? .Checkmark : .None
    }
    

    No need to use any table view delegate methods.

    Note: You have to call super.setSelected otherwise the cell doesn’t keep the selected state correctly.

    Swift 3.0
    Using just one function to keep it simple

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            tableView.deselectRow(at: indexPath, animated: true)
    
            if let cell = tableView.cellForRow(at: indexPath as IndexPath) {
                if cell.accessoryType == .checkmark{
                    cell.accessoryType = .none
                }
                else{
                    cell.accessoryType = .checkmark
                }
            }
    
    }