【问题标题】:Swift - Making a Button for UITableViewCell with .addTargetSwift - 使用 .addTarget 为 UITableViewCell 制作一个按钮
【发布时间】:2018-09-17 00:15:07
【问题描述】:

我正在尝试为我在表格视图中创建的每个单元格制作两个不同的按钮。其中一个按钮是一个 + 按钮,它将增加一个标签。但是,在我的测试中,我无法使该功能正常工作。我当前的错误说

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")

}

【问题讨论】:

  • 另请注意,点击仅针对按钮。它不在按钮和标签 together 上。所以你的 addItem 方法不需要知道标签。您可以从方法中删除它

标签: swift uitableview selector


【解决方案1】:

您错误地使用了选择器语法:

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

只要说:

action: #selector(addItem)

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

因此您将拥有发送者(按钮),但您必须从那里找出标签是什么。 (这应该很容易,因为知道按钮,你就知道单元格,知道单元格,你知道标签。)你不能将标签作为参数传递给按钮点击——但你不需要到。

【讨论】:

  • 感谢您的回答!删除这些确实是有道理的,但我无法弄清楚我将如何传递我的标签。传递标签的推荐方式是什么?
  • 你知道按钮,所以你可以很容易地弄清楚这是什么单元格,所以标签大概是那个单元格的itemAmount,对吧?所以我看不出有什么困难。
  • 你甚至可以把它变成一个 UIButton 子类,它本身有一个 label 属性,你可以直接指向标签!有很多方法可以做到这一点。
  • 关系是在按钮被点击的时候增加label的值。例如,当单击按钮时,标签从“0”变为“1”,依此类推。如果我将函数放在 TableViewCell 类中,我就可以做到这一点。但是,我的 TableViewController 的标题上有一个外部标签,我也想增加它,但我无法从 TableViewCell 外部传递该标签(或者至少无法弄清楚如何)
  • 很好,但正如我所说,您需要就此提出一个新问题;对于 this 问题的 cmets 来说,这不是一个合适的话题。这个问题结束了(我相信)。您的代码现在将编译并调用按钮操作方法。结束。
【解决方案2】:

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

class AddItemCell: UITableViewCell {

    var buttonClickCallback:(() -> Void)?

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

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

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

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 2018-01-05
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2018-05-08
    相关资源
    最近更新 更多