versiones guia español descargar actualizar ios iphone swift uitableview checkbox

ios - guia - marque/desmarque la casilla de verificación tocando la celda en la vista de tabla y cómo saber qué celda ha marcado o no marcado



qgis manual (1)

soy nuevo en ios swift 2.2. Intenté crear una vista de tabla con xib celular personalizado. y estoy poblando algunos datos en mi vista de tabla. Y también agregué un botón de casilla de verificación personalizado. Y estoy creando una clase separada para ese botón de casilla de verificación. Ahora cuando hago clic solo en mi botón en mi customcell.xib. Pero cuando toco en mi celda, mi casilla de verificación no cambia. Necesito tener ambos. Cuando hago clic en mi botón, debería cambiar para verificar y desmarcar la imagen. Cuando toco mi celular también necesito cambiar mi botón para verificar o desmarcar la imagen

Y cuando me desplazo hacia abajo y vuelvo a la parte superior, mis imágenes marcadas se sincronizan automáticamente con el cuadro de comprobación normal.

necesito hacer algo de acción, entonces para eso. Cuando toco en cualquier celda, mi casilla de verificación debe marcar y desmarcar. Y también necesito saber qué celda de fila ha verificado la imagen. Para que pueda realizar alguna acción solo para mi celda de fila de imagen marcada.

aquí está mi clase personalizada de casilla de verificación:

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

Clase de 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) { } }

mi 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. }

Por favor, ayúdame.

Gracias por adelantado


Para resolver su problema, como mencionó @El Capitan, necesitará usar el método didSelectRowAtIndexPath para cambiar sus estados. Tus códigos deberían verse de la siguiente manera:

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

Para volver a mostrar las celdas que se han comprobado antes después de desplazar las filas fuera de la vista, en su cellForRowAtIndexPath , realice la misma comprobación contra rowsWhichAreChecked y establezca sus estados en consecuencia.

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 RESPUESTA

He conseguido que tu código funcione pero tuve que hacer algunas modificaciones en tu clase Checkbox y 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. } }