Как изменить текст UILabel при программном нажатии UIStepper в Swift 4, если они оба находятся в UITableViewCell?

Swift 4: у меня есть статическая ячейка (сгруппированный стиль). Я просто добавляю в ячейку UILabel и UIStepper. Теперь я хотел бы изменить текст UILabel, когда я нажимаю UIStepper. Как на картинке:

Изображение 1

Вот мои коды:

if indexPath.section == 0 {
        cell.textLabel?.text = "\(first[indexPath.row])"


    let step = UIStepper()
    let label = UILabel()

    func labelValueChanged(sender:UIStepper!) {
        label.text = "\(Int(step.value))"
    }

    cell.addSubview(step)
    step.translatesAutoresizingMaskIntoConstraints = false
    step.centerYAnchor.constraint(equalTo: cell.centerYAnchor).isActive = true
    step.widthAnchor.constraint(equalToConstant: 94).isActive = true
    step.heightAnchor.constraint(equalToConstant: 29).isActive = true
    step.rightAnchor.constraint(equalTo: cell.rightAnchor, constant: -30).isActive = true
    step.addTarget(self, action: #selector(labelValueChanged), for: .valueChanged)



    cell.addSubview(label)
    label.text = "0"
    label.translatesAutoresizingMaskIntoConstraints = false
    label.centerYAnchor.constraint(equalTo: cell.centerYAnchor).isActive = true
    label.widthAnchor.constraint(equalToConstant: 50).isActive = true
    label.heightAnchor.constraint(equalToConstant: 21).isActive = true
    label.rightAnchor.constraint(equalTo: cell.rightAnchor, constant: -124).isActive = true

}

Будет ошибка, если внутри ячейки была добавлена ​​функция labelValueChanged: Argument of '#selector' cannot refer to local function 'labelValueChanged(sender:)'

Изображение

Но если функция labelValueChanged была добавлена ​​вне ячейки, метка и значение UIStepper будут недоступны.

Есть ли способ сделать это? Мы ценим любые предложения. Спасибо.


person Vincent    schedule 23.10.2017    source источник
comment
Вы можете создать собственный подкласс ячеек и позволить ему управлять своим собственным степпером и меткой.   -  person Phillip Mills    schedule 23.10.2017
comment
@rmaddy Мой вопрос: если я удалил функцию из ячейки, как я могу изменить текст метки.   -  person Vincent    schedule 23.10.2017
comment
@PhillipMills Спасибо, Филипп. Я попробую.   -  person Vincent    schedule 23.10.2017


Ответы (1)


Есть ли способ сделать это?

Один из способов сделать это — использовать свойство степпера tag для хранения номера строки ячейки. Затем контроллер представления может получить tag шагового двигателя и узнать, какая строка затронута. Однако это не идеально, потому что это не очень хорошо работает для таблиц с несколькими разделами.

Будет ошибка, если внутри ячейки была добавлена ​​функция labelValueChanged: Argument of '#selector' cannot refer to local function 'labelValueChanged(sender:)'

Я не могу точно сказать, почему у вас возникла эта проблема, но вы, безусловно, можете добавить метод IBAction в пользовательский класс ячеек таблицы, установить цель степпера в ячейку и установить действие степпера для этого метода. И вам не нужно устанавливать цель и действие программно — вы можете настроить их в редакторе раскадровки. Хорошая стратегия заключалась бы в том, чтобы ячейка затем делегировала реальную работу какому-либо объекту контроллера, возможно, контроллеру представления. Установка цели шагового двигателя в ячейку позволяет ячейке вызывать метод в контроллере, который включает в себя больше параметров, чем простое действие (которое имеет только параметр sender), поэтому вы можете пройти по строке и разделу, как изменилось значение шагового двигателя, и все, что вам может понадобиться.

person Caleb    schedule 23.10.2017
comment
Спасибо за ваш вклад. Как вы сказали, IBAction будет намного проще. Да, я пробовал это, прежде чем просить о помощи. Но, как вы можете видеть, Xcode иногда зависает, если у меня есть 10 или более разделов. Вот почему я обратился к чистым кодам. UIStepper, DatePicker и статические разделы — это кошмар. - person Vincent; 23.10.2017