check / uncheck the check box by tapping the cell in table view and how to know which cell has checked or unchecked

后端 未结 3 1220
一个人的身影
一个人的身影 2020-12-09 13:48

i am new to ios swift 2.2 . I tried to create one table view with custom cell xib. and i am populating some data in my table view. And also i added one custom check box butt

3条回答
  •  醉酒成梦
    2020-12-09 14:30

    In order to solve your issue, as @El Capitan mentioned, you will need to use the didSelectRowAtIndexPath method to change its states. Your codes should look something along the lines of this:

    // Declare a variable which stores checked rows. UITableViewCell gets dequeued and restored as you scroll up and down, so it is best to store a reference of rows which has been checked
    var rowsWhichAreChecked = [NSIndexPath]()
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
          let cell:FavCell = tableView.cellForRowAtIndexPath(indexPath) as! FavCell
          // cross checking for checked rows
          if(rowsWhichAreChecked.contains(indexPath) == false){
             cell.checkBox.isChecked = true
             rowsWhichAreChecked.append(indexPath) 
          }else{
             cell.checkBox.isChecked = false
             // remove the indexPath from rowsWhichAreCheckedArray
             if let checkedItemIndex = rowsWhichAreChecked.indexOf(indexPath){
                rowsWhichAreChecked.removeAtIndex(checkedItemIndex)
             }
          }
    }
    

    To redisplay cells which have been checked before after scrolling the rows out of view, at your cellForRowAtIndexPath, perform the same checking against rowsWhichAreChecked array and set its states accordingly.

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
    let cell:FavCell = self.FavTableView.dequeueReusableCellWithIdentifier("FCell") as! FavCell
    cell.FLabel1.text=arrDict[indexPath.section] .valueForKey("favourite_name") as? String
    cell.FLabel2.text=arrDict[indexPath.section] .valueForKey("favourite_address") as? String
    
    
       if(rowsWhichAreChecked.contains(indexPath) == false){
             cell.checkBox.isChecked = true
        }else{
            cell.checkBox.isChecked = false
        }
      }
        return cell           
    }
    

    EDITED ANSWER

    I have got your code to work but I had to make some modifications to your Checkbox class and ViewController

    Checkbox.swift

    class CheckBoxButton: UIButton {
    
        // Images
        let checkedImage = UIImage(named: "CheckBoxChecked")! as UIImage
        let uncheckedImage = UIImage(named: "CheckBoxUnChecked")! as UIImage
    
        // Bool property
        var isChecked: Bool = false {
            didSet{
                if isChecked == true {
                    self.setImage(uncheckedImage, forState: .Normal)
                } else {
                    self.setImage(checkedImage, forState: .Normal)
                }
            }
        }
    
        override func awakeFromNib() {
            self.userInteractionEnabled = false
    //        self.addTarget(self, action: #selector(CheckBoxButton.buttonClicked(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    //        self.isChecked = false
        }
    
        func buttonClicked(sender: UIButton) {
            if sender == self {
                if isChecked == true {
                    isChecked = false
                } else {
                    isChecked = true
                }
            }
        }
    
    }
    

    ViewController.swift

    class FavVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    
        @IBOutlet weak var FavTableView: UITableView!
    
    
        var rowsWhichAreChecked = [NSIndexPath]()
    
        //var FData = [FavouritesData]()
    
        var arrDict :NSMutableArray=[]
    
        let cellSpacingHeight: CGFloat = 5  // cell spacing from each cell in table view
    
        override func viewDidLoad() {
    
            self.FavTableView.delegate = self
            self.FavTableView.dataSource = self
    
            super.viewDidLoad()
    
            self.jsonParsingFromURL()
    
            let nib = UINib(nibName:"FavCell", bundle: nil)
    
            FavTableView.registerNib(nib, forCellReuseIdentifier: "FCell")
    
        }
    
        // web services method
        func jsonParsingFromURL ()
        {
    //        let token = NSUserDefaults.standardUserDefaults().valueForKey("access_token") as? String
    
            let url = NSURL(string: "some url")
    
            let session = NSURLSession.sharedSession()
    
            let request = NSURLRequest(URL: url!)
    
            let dataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in
                // print("done, error: \(error)")
    
                if error == nil
                {
    
                    dispatch_async(dispatch_get_main_queue())
                    {
                        self.arrDict=(try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)) as! NSMutableArray
                        if (self.arrDict.count>0)
                        {
                            self.FavTableView.reloadData()
                        }
                    }
    
                }
    
    
            }
            dataTask.resume()
    
    //        
    //        let StringUrl = "http"+token!
    
    //        let url:NSURL = NSURL(string: StringUrl)!
    
    //        if let JSONData = NSData(contentsOfURL: url)
    //        {
    //            if let json = (try? NSJSONSerialization.JSONObjectWithData(JSONData, options: [])) as? NSDictionary
    //            {
    //                for values in json
    //                {
    //                    self.FData.append()
    //                }
    
    //                if let reposArray = json["data"] as? [NSDictionary]
    //                {
    //                    
    //                    for item in reposArray
    //                    {
    //                        let itemObj = item as? Dictionary
    //                        
    //                        let b_type = itemObj!["business_type"]?.valueForKey("type")
    //                        
    //                        //self.Resultcount.text = "\(b_type?.count) Results"
    //                        
    //                        if (b_type as? String == "Taxis")
    //                        {
    //                            
    //                            self.FData.append(FavouritesData(json:item))
    //                            
    //                        }
    //                    }
    //                }
    
    //            }
    //        }
    
        }
    
        func numberOfSectionsInTableView(tableView: UITableView) -> Int
        {
    //        return self.FData.count
            return self.arrDict.count
        }
    
    
        // number of rows
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
        {
            return 1
        }
    
        // height for each cell
        func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
        {
            return cellSpacingHeight
        }
    
        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
        {
    
            let cell:FavCell = self.FavTableView.dequeueReusableCellWithIdentifier("FCell") as! FavCell
            cell.FLabel1.text=arrDict[indexPath.section] .valueForKey("favourite_name") as? String
            cell.FLabel2.text=arrDict[indexPath.section] .valueForKey("favourite_address") as? String
    
            let isRowChecked = rowsWhichAreChecked.contains(indexPath)
    
            if(isRowChecked == true)
            {
                cell.checkbox.isChecked = true
                cell.checkbox.buttonClicked(cell.checkbox)
            }else{
                cell.checkbox.isChecked = false
                cell.checkbox.buttonClicked(cell.checkbox)
            }
    
        return cell
    }
    
        func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
            let cell:FavCell = tableView.cellForRowAtIndexPath(indexPath) as! FavCell
            // cross checking for checked rows
            if(rowsWhichAreChecked.contains(indexPath) == false){
                cell.checkbox.isChecked = true
                cell.checkbox.buttonClicked(cell.checkbox)
                rowsWhichAreChecked.append(indexPath)
            }else{
                cell.checkbox.isChecked = false
                cell.checkbox.buttonClicked(cell.checkbox)
                // remove the indexPath from rowsWhichAreCheckedArray
                if let checkedItemIndex = rowsWhichAreChecked.indexOf(indexPath){
                    rowsWhichAreChecked.removeAtIndex(checkedItemIndex)
                }
            }
        }
    
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    }
    

提交回复
热议问题