递归UITableViewCell按钮动作

时间:2017-04-26 17:39:34

标签: ios swift uitableview

我能够生成UITableViewUITableViewCell,但我的操作无法正常运行。我的用例类似于this video

我使用this问题作为参考,并且是不可取的

我错过了什么?有什么东西快速3相关?

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
    } 
}

3 个答案:

答案 0 :(得分:2)

有一种更智能的方法可以处理自定义单元格中的按钮操作。

在自定义单元格中创建一个没有参数/无返回值的回调闭包,并且IBAction连接到该按钮。在动作中调用回调

class CustomCell: UITableViewCell {

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

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

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

cellForRow中为回调分配闭包,捕获索引路径。

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
}

注意:return不是函数(没有括号)。

答案 1 :(得分:0)

尝试直接访问单元格的按钮。而不是

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

直接在按钮上设置属性。

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

答案 2 :(得分:0)

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