通过点击表格视图中的单元格来选中/取消选中复选框以及如何知道哪个单元格已选中或未选中 [英] check / uncheck the check box by tapping the cell in table view and how to know which cell has checked or unchecked

查看:12
本文介绍了通过点击表格视图中的单元格来选中/取消选中复选框以及如何知道哪个单元格已选中或未选中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 ios swift 2.2 的新手.我尝试使用自定义单元格 xib 创建一个表格视图.我正在我的表格视图中填充一些数据.我还添加了一个自定义复选框按钮.我正在为那个复选框按钮创建单独的类.现在,当我只单击 customcell.xib 中的按钮时.但是当我点击我的单元格时,我的复选框没有改变.我需要两者兼而有之.当我单击我的按钮时,它应该更改为选中和取消选中图像.当我点击我的手机时,我还需要更改我的按钮以选中或取消选中图像

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 button. And i am creating separate class for that check box button. Now when i click only on my button in my customcell.xib .But when i tap on my cell, my check box are not changing. i need to have both. When i click on my button it should change to check and uncheck image. When i tap on my cell also i need to change my button to check or uncheck image

当我向下滚动并再次回到顶部时,我选中的图像会自动更改为正常复选框.

And when i scroll down and again come back to top, my checked images are automatically chnaged to normalcheck box.

我需要做一些事情,所以为此.当我点击任何单元格时,我的复选框应该选中并取消选中.另外我需要知道哪一行单元格已选中图像.这样我就可以单独对选中的图像行单元格执行一些操作.

i need to do some action , so for that. When i tap on any cell my check box should check and uncheck.And alos i need to know which row cell has checked image . So that i can perform some action for my checked image row cell alone.

这是我的自定义复选框类:

here is my custom check box class:

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 类:

Cutom cell.xib class:

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 方法来更改其状态.您的代码应该类似于以下内容:

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

要在将行滚动到视图之外后重新显示之前检查过的单元格,请在您的 cellForRowAtIndexPath 中,对 rowsWhichAreChecked 数组执行相同的检查并相应地设置其状态.

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           
}

编辑后的答案

我已经让你的代码正常工作,但我不得不对你的 Checkbox 类和 ViewController 进行一些修改

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

}

这篇关于通过点击表格视图中的单元格来选中/取消选中复选框以及如何知道哪个单元格已选中或未选中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆