Select multiple rows in tableview and tick the selected ones

前端 未结 5 1655
北海茫月
北海茫月 2020-12-12 17:34

I\'m loading a tableView from a plist file. This works with no problems. I just simply want to \"tick\" the selected rows. At the moment, with my code it didn\'t work as des

相关标签:
5条回答
  • 2020-12-12 17:58

    First of all, go to your Storyboard and select you tableview and in the Attributes Inspector, set Selection to Multiple Selection.

    Attributes Inspector with multiple selection

    Then, override the setSelected(_ selected: Bool, animated: Bool) function in the subclass of UITableViewCell.

    override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
            accessoryType = selected ? UITableViewCellAccessoryType.checkmark : UITableViewCellAccessoryType.none
        }
    
    0 讨论(0)
  • 2020-12-12 18:05

    you have to make a costume class to get the selected state of the cell where you must override a func called setSelected(_ selected: Bool, animated: Bool) or the tick will be displayed randomly as you scroll ... here is an example of what i did: 1- created a class for the cell 2- added an outlet for an image to display the tick (you can escape this if you don't want a costume tick image) 3- overrided the function and used the param selected :D

    here is my class:

    import UIKit
    
    class AddLocationCell: UITableViewCell {
    
         @IBOutlet weak var check: UIImageView!
    
            override func awakeFromNib() {
                super.awakeFromNib()
                // Initialization code
            }
    
            override func setSelected(_ selected: Bool, animated: Bool) {
                super.setSelected(selected, animated: animated)
                if selected{
                    check.image = UIImage(named:"check_active")
                }else{
                    check.image = UIImage(named:"check_normal")
    
                }
                // Configure the view for the selected state
            }
    }
    
    0 讨论(0)
  • 2020-12-12 18:14

    Swift 4

    First, make your tableView support multiple selection :

    self.tableView.allowsMultipleSelection = true
    self.tableView.allowsMultipleSelectionDuringEditing = true
    

    Then simply subclass UITableViewCell like this :

    class CheckableTableViewCell: UITableViewCell {
        override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)
            self.selectionStyle = .none
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override func setSelected(_ selected: Bool, animated: Bool) {
            super.setSelected(selected, animated: animated)
            self.accessoryType = selected ? .checkmark : .none
        }
    }
    

    Finally, use it in your cellForRowAt indexPath as such :

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", 
        for: indexPath) as? CheckableTableViewCell
    

    If you have to, don't forget to subclass your prototype cell in your xib/storyboard :

    0 讨论(0)
  • 2020-12-12 18:17

    This enable untick.

    class TableViewController: UITableViewController
    {
        var lastSelectedIndexPath = NSIndexPath(forRow: -1, inSection: 0)
    
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
        {
            let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) 
    
            // Configure the cell...
            cell.textLabel!.text = "row: \(indexPath.row)"
    
            if cell.selected
            {
                cell.selected = false
                if cell.accessoryType == UITableViewCellAccessoryType.None
                {
                    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
                }
                else
                {
                    cell.accessoryType = UITableViewCellAccessoryType.None
                }
            }
    
            return cell
        }
    
        override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
        {
            let cell = tableView.cellForRowAtIndexPath(indexPath)
    
            if cell!.selected
            {
                cell!.selected = false
                if cell!.accessoryType == UITableViewCellAccessoryType.None
                {
                    cell!.accessoryType = UITableViewCellAccessoryType.Checkmark
                }
                else
                {
                    cell!.accessoryType = UITableViewCellAccessoryType.None
                }
            }
        }
    
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
        {
            return 100
        }
    }
    
    0 讨论(0)
  • 2020-12-12 18:20

    There are many solutions to this problem, here's one I came up with. I am using the built in cell "selected" property so the tableview saves it for us. Just make sure in your storyboard or when you setup the tableview in code you use multiple selection.

    import UIKit
    
    class TableViewController: UITableViewController
    {
        var lastSelectedIndexPath = NSIndexPath(forRow: -1, inSection: 0)
    
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
        {
            let cell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! UITableViewCell
    
            // Configure the cell...
            cell.textLabel!.text = "row: \(indexPath.row)"
    
            if cell.selected
            {
                cell.accessoryType = UITableViewCellAccessoryType.Checkmark
            }
            else
            {
                cell.accessoryType = UITableViewCellAccessoryType.None
            }
    
            return cell
        }
    
        override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
        {
            let cell = tableView.cellForRowAtIndexPath(indexPath)
    
            if cell!.selected == true
            {
                cell!.accessoryType = UITableViewCellAccessoryType.Checkmark
            }
            else
            {
                cell!.accessoryType = UITableViewCellAccessoryType.None
            }
        }
    
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
        {
            return 100
        }
    }
    

    I made a sample project here: https://github.com/brcimo/SwiftTableViewMultipleSelection

    0 讨论(0)
提交回复
热议问题