通过点击表格视图中的单元格来选中/取消选中该checkbox,以及如何知道哪个单元格已被选中或未选中

我是新来的ios Swift 2.2。 我试图用自定义单元格xib创build一个表视图。 我在我的表格视图中填充一些数据。 而且我还添加了一个自定义checkboxbutton。 我正在为该checkboxbutton创build单独的类。 现在,当我只点击我的customcell.xib中的button。但是当我点击我的单元格时,我的checkbox不会更改。 我需要有两个。 当我点击我的button,它应该改变检查和取消选中图像。 当我点击我的细胞也需要更改我的button来检查或取消选中图像

而当我向下滚动,再次回到顶部时,我检查的图像会自动chnaged到正常检查框。

我需要做一些行动,所以为此。 当我点击任何单元格时,我的checkbox应该检查并取消选中。我需要知道哪一行单元格检查了图像。 所以我可以单独执行我选中的图像行单元格。

这里是我的自定义checkbox类:

import UIKit 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(checkedImage, forState: .Normal) } else { self.setImage(uncheckedImage, forState: .Normal) } } } override func awakeFromNib() { 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 } } } } 

Cutom cell.xib类:

 import UIKit class FavCell: UITableViewCell { @IBOutlet weak var FLabel1: UILabel! @IBOutlet weak var FLabel2: UILabel! @IBOutlet weak var checkbox: CheckBoxButton! override func awakeFromNib() { super.awakeFromNib() // Initialization code } @IBAction func checkboxpress(sender: AnyObject) { } } 

我的viewcontroller.swift

 import UIKit class FavVC: UIViewController { @IBOutlet weak var FavTableView: UITableView! //var FData = [FavouritesData]() var arrDict :NSMutableArray=[] let cellSpacingHeight: CGFloat = 5 // cell spacing from each cell in table view override func viewDidLoad() { 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: "som 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() } 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 return cell } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } 

请帮助我。

提前致谢

为了解决你的问题,正如@El Capitan提到的,你将需要使用didSelectRowAtIndexPath方法来改变它的状态。 你的代码应该看起来像这样:

 // 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) } } } 

要重新显示在将行移出视图之后检查过的单元格,在cellForRowAtIndexPath ,对rowsWhichAreChecked数组执行相同的检查并相应地设置其状态。

 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 } 

编辑答案

我有你的代码工作,但我不得不对你的checkbox类和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<String,AnyObject> // // 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. } }