Swift-使用.addTarget

时间:2018-09-17 00:15:07

标签: swift uitableview selector

我试图为在表格视图中创建的每个单元格创建两个不同的按钮。按钮之一是+按钮,它将增加标签。但是在测试中,我无法使用该功能。我当前的错误提示

Argument of #selector does not refer to an '@objc' method, property, or initializer

我觉得我实现的.addTarget方法完全错误,但是我是新手。这是我的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let item = items[indexPath.section]

    let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell") as! AddItemCell

    cell.setCell(item: item)

    let itemAmount = cell.itemAmount as UILabel?

    cell.addButton.addTarget(self, action: #selector(addItem(sender:cell.addButton,forLabel:itemAmount!)), for: .touchUpInside)

}


@objc func addItem(sender: UIButton, forLabel label:UILabel) {

    print("Add Button Clicked")

}

2 个答案:

答案 0 :(得分:1)

您使用的选择器语法不正确:

action: #selector(addItem(sender:cell.addButton,forLabel:itemAmount!))

只要说:

action: #selector(addItem)

然后,您将面临一个新问题。您认为可以通过某种方式使此按钮调用名为addItem(sender:forLabel:)的东西。你不能将addItem的声明更改为addItem(_ sender:UIButton)。这是按钮点击可以调用的唯一功能。

因此,您将拥有发送者(按钮),但是您必须从那里弄清 标签是什么。 (这应该很容易,因为了解按钮,您知道单元格,并且知道单元格,您知道标签。)您无法将标签作为参数来响应按钮的点击,但是您不需要传递标签,但是您不需要

答案 1 :(得分:0)

您需要在单元格中创建回调函数

class AddItemCell: UITableViewCell {

    var buttonClickCallback:(() -> Void)?

    @IBAction func onButtonClick(_ sender:Any) {
        buttonClickCallback?()
    }
}

并以buttonClickCallback方法分配tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let item = items[indexPath.section]
    let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell") as! AddItemCell
    cell.setCell(item: item)
    let itemAmount = cell.itemAmount as UILabel?
    cell.buttonClickCallback = {
        self.addItem(sender:cell.addButton,forLabel:itemAmount!)
    } 
}