UITableViewCell Buttons with action

前端 未结 7 977
无人共我
无人共我 2020-12-01 00:27

Hi I have a custom UITableViewCell with three buttons to handle a shopping cart function, Plus,Minus and Delete button and I need to know which cell has been touched.

7条回答
  •  孤城傲影
    2020-12-01 01:00

    I was resolving this using a cell delegate method within UITableViewCell's subclass.

    Quick overview:

    1) Create a protocol

    protocol YourCellDelegate : class {
        func didPressButton(_ tag: Int)
    }
    

    2) Subclass your UITableViewCell (if you haven't done so):

    class YourCell : UITableViewCell
    {
         var cellDelegate: YourCellDelegate?   
          @IBOutlet weak var btn: UIButton!
        // connect the button from your cell with this method
        @IBAction func buttonPressed(_ sender: UIButton) {
            cellDelegate?.didPressButton(sender.tag)
        }         
        ...
    }
    

    3) Let your view controller conform to YourCellDelegate protocol that was implemented above.

    class YourViewController: ..., YourCellDelegate {  ... }
    

    4) Set a delegate, after the cell has been defined (for reusing).

    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! YourCell
    cell.cellDelegate = self
    cell.btn.tag = indexPath.row
    

    5) In the same controller (where is your implemented UITableView delegate/datasource), put a method from YourCellDelegate protocol.

    func didPressButton(_ tag: Int) {
         print("I have pressed a button with a tag: \(tag)")
    }
    

    Now, your solution is not tag / number dependent. You can add as many buttons as you want, so you are ready to get response via delegate regardless how many buttons you want to install.

    This protocol-delegate solution is preferred in iOS logic and it can be used for other elements in table cell, like UISwitch, UIStepper, and so on.

提交回复
热议问题