0

I have a UITableView list with a button which says "Click Me!". I tried following this answer below: https://stackoverflow.com/a/53043358/7746248 to tie the button to an action, but that didn't work for unknown reasons.

I have checked other ways to tie a button to an event, I have had no luck.

import UIKit

class SampleTableViewCell: UITableViewCell {
    @IBOutlet weak var name: UILabel!
    @IBOutlet weak var button: UIButton!

    var tapCallback: (() -> Void)?
    @IBAction func didTap(_ sender: Any) {
        tapCallback?()
    }
}

class TableViewController: UITableViewController {

    var tableArray = ["New York", "Chicago", "North Island"]

    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        self.clearsSelectionOnViewWillAppear = false

        self.tableView.dataSource = self
        self.tableView.delegate = self
        self.tableView.reloadData()
    }

    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return self.tableArray.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SampleCell", for: indexPath) as! SampleTableViewCell

        // Configure the cell...
        cell.selectionStyle = UITableViewCell.SelectionStyle.none
        let names = self.tableArray[indexPath.row]
        cell.name.text = names

        cell.tapCallback = {
            // do stuff
            DispatchQueue.main.async {
                let alert = UIAlertController(title: "title", message: "Button Clicked!", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil))
                self.present(alert, animated: true)
            }
        }

        return cell
    }

}

enter image description here

Any other simple way to do this?

truthsayer
  • 397
  • 2
  • 8
  • 22

1 Answers1

0

Add target inside cellForRowAt like below

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SampleCell", for: indexPath) as! SampleTableViewCell

        // Configure the cell...
        cell.selectionStyle = UITableViewCell.SelectionStyle.none
        let names = self.tableArray[indexPath.row]
        cell.name.text = names

        cell. button.addTarget(self, action: #selector(alertMethod), for: .touchUpInside)

        return cell
    }

@objc fileprivate func alertMethod() {
                let alert = UIAlertController(title: "title", message: "Button Clicked!", preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Close", style: .cancel, handler: nil))
                self.present(alert, animated: true)
            }
}
Vicky_Vignesh
  • 584
  • 2
  • 14