How to get the indexpath.row when an element is activated?

前端 未结 19 2170
梦如初夏
梦如初夏 2020-11-21 23:30

I have a tableview with buttons and I want to use the indexpath.row when one of them is tapped. This is what I currently have, but it always is 0

var point =         


        
19条回答
  •  南笙
    南笙 (楼主)
    2020-11-22 00:09

    I found a very easy way to use for manage any cell in tableView and collectionView by using a Model class and this a work as perfectly.

    There is indeed a much better way to handle this now. This will work for manage cell and value.

    Here is my output(screenshot) so see this:

    1. Its very simple to create model class, please follow the below procedure. Create swift class with name RNCheckedModel, write the code as below.
    class RNCheckedModel: NSObject {
    
        var is_check = false
        var user_name = ""
    
        }
    
    1. create your cell class
    class InviteCell: UITableViewCell {
    
        @IBOutlet var imgProfileImage: UIImageView!
        @IBOutlet var btnCheck: UIButton!
        @IBOutlet var lblName: UILabel!
        @IBOutlet var lblEmail: UILabel!
        }
    
    1. and finally use model class in your UIViewController when you use your UITableView.
        class RNInviteVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    
        @IBOutlet var inviteTableView: UITableView!
        @IBOutlet var btnInvite: UIButton!
    
        var checkArray : NSMutableArray = NSMutableArray()
        var userName : NSMutableArray = NSMutableArray()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            btnInvite.layer.borderWidth = 1.5
            btnInvite.layer.cornerRadius = btnInvite.frame.height / 2
            btnInvite.layer.borderColor =  hexColor(hex: "#512DA8").cgColor
    
            var userName1 =["Olivia","Amelia","Emily","Isla","Ava","Lily","Sophia","Ella","Jessica","Mia","Grace","Evie","Sophie","Poppy","Isabella","Charlotte","Freya","Ruby","Daisy","Alice"]
    
    
            self.userName.removeAllObjects()
            for items in userName1 {
               print(items)
    
    
                let model = RNCheckedModel()
                model.user_name = items
                model.is_check = false
                self.userName.add(model)
            }
          }
         @IBAction func btnInviteClick(_ sender: Any) {
    
        }
           func tableView(_ tableView: UITableView, numberOfRowsInSection 
           section: Int) -> Int {
            return userName.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: InviteCell = inviteTableView.dequeueReusableCell(withIdentifier: "InviteCell", for: indexPath) as! InviteCell
    
            let image = UIImage(named: "ic_unchecked")
            cell.imgProfileImage.layer.borderWidth = 1.0
            cell.imgProfileImage.layer.masksToBounds = false
            cell.imgProfileImage.layer.borderColor = UIColor.white.cgColor
            cell.imgProfileImage.layer.cornerRadius =  cell.imgProfileImage.frame.size.width / 2
            cell.imgProfileImage.clipsToBounds = true
    
            let model = self.userName[indexPath.row] as! RNCheckedModel
            cell.lblName.text = model.user_name
    
            if (model.is_check) {
                cell.btnCheck.setImage(UIImage(named: "ic_checked"), for: UIControlState.normal)
            }
            else {
                cell.btnCheck.setImage(UIImage(named: "ic_unchecked"), for: UIControlState.normal)
            }
    
            cell.btnCheck.tag = indexPath.row
            cell.btnCheck.addTarget(self, action: #selector(self.btnCheck(_:)), for: .touchUpInside)
    
            cell.btnCheck.isUserInteractionEnabled = true
    
        return cell
    
        }
    
        func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            return 80
    
        }
    
        @objc func btnCheck(_ sender: UIButton) {
    
            let tag = sender.tag
            let indexPath = IndexPath(row: tag, section: 0)
            let cell: InviteCell = inviteTableView.dequeueReusableCell(withIdentifier: "InviteCell", for: indexPath) as! InviteCell
    
            let model = self.userName[indexPath.row] as! RNCheckedModel
    
            if (model.is_check) {
    
                model.is_check = false
                cell.btnCheck.setImage(UIImage(named: "ic_unchecked"), for: UIControlState.normal)
    
                checkArray.remove(model.user_name)
                if checkArray.count > 0 {
                    btnInvite.setTitle("Invite (\(checkArray.count))", for: .normal)
                    print(checkArray.count)
                    UIView.performWithoutAnimation {
                        self.view.layoutIfNeeded()
                    }
                } else {
                    btnInvite.setTitle("Invite", for: .normal)
                    UIView.performWithoutAnimation {
                        self.view.layoutIfNeeded()
                    }
                }
    
            }else {
    
                model.is_check = true
                cell.btnCheck.setImage(UIImage(named: "ic_checked"), for: UIControlState.normal)
    
                checkArray.add(model.user_name)
                if checkArray.count > 0 {
                    btnInvite.setTitle("Invite (\(checkArray.count))", for: .normal)
                    UIView.performWithoutAnimation {
                    self.view.layoutIfNeeded()
                    }
                } else {
                     btnInvite.setTitle("Invite", for: .normal)
                }
            }
    
            self.inviteTableView.reloadData()
        }
    
        func hexColor(hex:String) -> UIColor {
            var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
    
            if (cString.hasPrefix("#")) {
                cString.remove(at: cString.startIndex)
            }
    
            if ((cString.count) != 6) {
                return UIColor.gray
            }
    
            var rgbValue:UInt32 = 0
            Scanner(string: cString).scanHexInt32(&rgbValue)
    
            return UIColor(
                red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
                green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
                blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
                alpha: CGFloat(1.0)
            )
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
    
        }
    
         }
    

提交回复
热议问题