How to uncheck all rows using UITableViewCellAccessoryCheckmark

后端 未结 4 1252
栀梦
栀梦 2021-02-20 10:48

I\'ve got a UITableView with each row containing a checkbox using UITableViewCellAccessoryCheckmark. I can\'t figure out how to uncheck all the checkbo

4条回答
  •  盖世英雄少女心
    2021-02-20 11:33

    Instead of modifying the .accessoryType of all cells in didSelectRowAtIndexPath:, I suggest storing the selected index in some ivar, and change the .accessoryType in the data source's -tableView:cellForRowAtIndexPath: method, i.e.

    -(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath { 
       self.selectedIndexPath = indexPath;
       [tableView reloadData];
    }
    
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
       ...
       cell.accessoryType = [indexPath compare:self.selectedIndexPath] == NSOrderedSame
                              ? UITableViewCellAccessoryCheckmark
                              : UITableViewCellAccessoryNone;
       ...
    }
    

    With this, only visible cells will be affected, and the million other cells outside of the screen won't need to be modified.


    Quite right, here's a full implementation in Swift in the general case of selecting a cell .. you'd use selectedIndexPath elsewhere in the class as you see fit. For example, in cellForRowAtIndexPath to choose the appropriate cell prototype.

    //  SelectingTableViewController
    
    import UIKit
    
    class SelectingTableViewController: UITableViewController   
        {
        internal var selectedIndexPath:NSIndexPath? = nil
    
        override func viewDidLoad()
            {
            super.viewDidLoad()
            tableView.estimatedRowHeight = 68.0
            tableView.rowHeight = UITableViewAutomaticDimension
    
            self.clearsSelectionOnViewWillAppear = false;
            }
    
        override func tableView
            (tableView:UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath)
                {
                print("did select....")
    
                // in fact, was this very row selected,
                // and the user is clicking to deselect it...
                // if you don't want "click a selected row to deselect"
                // then on't include this clause.
                if selectedIndexPath == indexPath
                    {
                    print("(user clicked on selected to deselect)")
                    selectedIndexPath = nil
                    tableView.reloadRowsAtIndexPaths(
                        [indexPath],
                        withRowAnimation:UITableViewRowAnimation.None)
    
                    tableView.deselectRowAtIndexPath(indexPath, animated:false)
                    return
                    }
    
                // in fact, was some other row selected??
                // user is changing to this row? if so, also deselect that row
                if selectedIndexPath != nil
                    {
                    let pleaseRedrawMe = selectedIndexPath!
                    // (note that it will be drawn un-selected
                    // since we're chaging the 'selectedIndexPath' global)
                    selectedIndexPath = indexPath
                    tableView.reloadRowsAtIndexPaths(
                        [pleaseRedrawMe, indexPath],
                        withRowAnimation:UITableViewRowAnimation.None)
                    return;
                    }
    
                // no previous selection.
                // simply select that new one the user just touched.
                // note that you can not use Apple's willDeselectRowAtIndexPath
                // functions ... because they are freaky
                selectedIndexPath = indexPath
                tableView.reloadRowsAtIndexPaths(
                    [indexPath],
                    withRowAnimation:UITableViewRowAnimation.None)
    
                }
    
        }
    

提交回复
热议问题