我试图为在表格视图中创建的每个单元格创建两个不同的按钮。按钮之一是+按钮,它将增加标签。但是在测试中,我无法使用该功能。我当前的错误提示
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")
}
答案 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!)
}
}