简体   繁体   中英

Recursive UITableViewCell button Action

I'm able to generate a UITableView and a UITableViewCell however my action is not working properly. My use case is similiar to this video

I was using this question as a reference and was uncesscessful

What am I missing? Something swift 3 related?

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    var categories = ["foo", "bar"]

    func logAction(sender: UIButton!){
        print("HIT BUTTON YO")
    }

    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.categories.count
    }

    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {      
        let cell:CustomCell = tableView.dequeueReusableCell(withIdentifier: "categories", for: indexPath) as! CustomCell
        cell.label.text = categories[indexPath.row]
        let button = cell.button
        button?.tag = indexPath.row
        button?.addTarget(self, action: #selector(self.logAction), for: .touchUpInside)
        return(cell)
    }
}


class CustomCell: UITableViewCell {

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var label: UILabel!


    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        //Configure view for selected state
    } 
}

There is a smarter way to handle a button action in a custom cell.

In the custom cell create a callback closure with no parameter / no return value and an IBAction connected to the button. In the action call the callback

class CustomCell: UITableViewCell {

    @IBOutlet weak var button: UIButton!
    @IBOutlet weak var label: UILabel!

    var callback : (()->())?

    @IBAction func logAction(_ sender : UIButton) {
        callback?()
    }
}

In cellForRow assign a closure to the callback, the index path is captured.

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "categories", for: indexPath) as! CustomCell
    cell.label.text = categories[indexPath.row]
    cell.callback = {
        print("Button pressed", indexPath)
    }
    return cell
}

Note: return is not a function (no parentheses).

Try accessing the cell's button directly. Instead of

let button = cell.button
button?.tag = indexPath.row
button?.addTarget(self, action: #selector(self.logAction), for: .touchUpInside)

Set the properties on the button directly.

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

是的,所以我只是删除了视图控制器并重新制作,它现在可以工作了__(ツ)_ /

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM