我是ios swift 2.2的新手。我尝试使用自定义单元格xib创建一个表视图。我正在表格视图中填充一些数据。而且我还添加了一个自定义复选框按钮。我正在为该复选框按钮创建单独的类。现在,当我仅单击customcell.xib中的按钮时,但是当我单击单元格时,我的复选框没有更改。我需要两个。当我单击我的按钮时,它应该更改为选中和取消选中图像。当我点击单元格时,我还需要更改按钮以检查或取消选中图像
当我向下滚动并再次回到顶部时,选中的图像会自动更改为“正常”复选框。
我需要采取一些措施,为此。当我点击任何单元格时,我的复选框应选中并取消选中。此外,我还需要知道哪个行单元格已选中图像。这样我就可以对选中的图像行单元格单独执行一些操作。
这是我的自定义复选框类:
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
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方法来更改其状态。您的代码应类似于以下内容:
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对rowsWhichAreCheckedarray 执行相同的检查,并相应地设置其状态。
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. } }