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

前端 未结 19 2173
梦如初夏
梦如初夏 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:04

    For Swift2.1

    I found a way to do it, hopefully, it'll help.

    let point = tableView.convertPoint(CGPoint.zero, fromView: sender)
    
        guard let indexPath = tableView.indexPathForRowAtPoint(point) else {
            fatalError("can't find point in tableView")
        }
    
    0 讨论(0)
  • 2020-11-22 00:04

    Try using #selector to call the IBaction.In the cellforrowatindexpath

                cell.editButton.tag = indexPath.row
            cell.editButton.addTarget(self, action: #selector(editButtonPressed), for: .touchUpInside)
    

    This way you can access the indexpath inside the method editButtonPressed

    func editButtonPressed(_ sender: UIButton) {
    
    print(sender.tag)//this value will be same as indexpath.row
    
    }
    
    0 讨论(0)
  • 2020-11-22 00:05

    USING A SINGLE TAG FOR ROWS AND SECTIONS

    There is a simple way to use tags for transmitting the row/item AND the section of a TableView/CollectionView at the same time.

    Encode the IndexPath for your UIView.tag in cellForRowAtIndexPath :

    buttonForCell.tag = convertIndexPathToTag(with: indexPath)
    

    Decode the IndexPath from your sender in your target selector:

        @IBAction func touchUpInsideButton(sender: UIButton, forEvent event: UIEvent) {
    
            var indexPathForButton = convertTagToIndexPath(from: sender)
    
        }
    

    Encoder and Decoder:

    func convertIndexPathToTag(indexPath: IndexPath) -> Int {
        var tag: Int = indexPath.row + (1_000_000 * indexPath.section)
        
        return tag
    }
    
    func convertTagToIndexPath(from sender: UIButton) -> IndexPath {
        var section: Int = Int((Float(sender.tag) / 1_000_000).rounded(.down))
        var row: Int = sender.tag - (1_000_000 * section)
    
        return IndexPath(row: row, section: section)
    }
    

    Provided that you don’t need more than 4294967296 rows/items on a 32bit device ;-) e.g.

    • 42949 sections with 100_000 items/rows
    • 4294 sections with 1_000_000 items/rows - (like in the example above)
    • 429 sections with 10_000_000 items/rows

    —-

    WARNING: Keep in mind that when deleting or inserting rows/items in your TableView/CollectionView you have to reload all rows/items after your insertion/deletion point in order to keep the tag numbers of your buttons in sync with your model.

    —-

    0 讨论(0)
  • 2020-11-22 00:06

    After seeing Paulw11's suggestion of using a delegate callback, I wanted to elaborate on it slightly/put forward another, similar suggestion. Should you not want to use the delegate pattern you can utilise closures in swift as follows:

    Your cell class:

    class Cell: UITableViewCell {
        @IBOutlet var button: UIButton!
    
        var buttonAction: ((sender: AnyObject) -> Void)?
    
        @IBAction func buttonPressed(sender: AnyObject) {
            self.buttonAction?(sender)
        }
    }
    

    Your cellForRowAtIndexPath method:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! Cell
        cell.buttonAction = { (sender) in
            // Do whatever you want from your button here.
        }
        // OR
        cell.buttonAction = buttonPressed // <- Method on the view controller to handle button presses.
    }
    
    0 讨论(0)
  • 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()
    
        }
    
         }
    
    0 讨论(0)
  • 2020-11-22 00:10

    Very Simple getting Index Path swift 4, 5

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! Cell
    cell.btn.tag = indexPath.row
    cell.btn.addTarget(self, action: "buttonTapped:", forControlEvents: 
    UIControlEvents.TouchUpInside)
    

    How to get IndexPath Inside Btn Click :

    func buttonTapped(_ sender: UIButton) {
         print(sender.tag)  
    }
    
    0 讨论(0)
提交回复
热议问题