Swift - Создание кнопки для UITableViewCell с .addTarget - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь создать две разные кнопки для каждой ячейки, которую создаю в виде таблицы.Одна из кнопок - это кнопка +, которая увеличивает метку.Однако в моем тестировании я не могу заставить эту функцию работать.Моя текущая ошибка говорит

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 голосов
/ 17 сентября 2018

Вам необходимо создать функцию обратного вызова в вашей ячейке

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!)
    } 
}
0 голосов
/ 17 сентября 2018

Вы неправильно используете синтаксис селектора:

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

Просто скажи:

action: #selector(addItem)

Тогда, однако, вы столкнетесь с новой проблемой. Вы думаете, что каким-то образом вы можете заставить эту кнопку вызывать то, что называется addItem(sender:forLabel:). Ты не можешь Измените объявление addItem на addItem(_ sender:UIButton). Это единственная функция, которую может вызвать нажатие кнопки.

Таким образом, у вас будет отправитель (кнопка), но вы должны выяснить оттуда что такое ярлык. (И это должно быть легко, потому что, зная кнопку, вы знаете ячейку, и зная ячейку, вы знаете метку.) Вы не можете передать метку в качестве параметра в ответ на нажатие кнопки - но вам не нужно к.

...