UIStepper не регистрирует никаких событий

Я добавляю UIStepper в горизонтальный UIStackView, который сам находится в вертикальном UIStackView. Проблема в том, что что бы я ни делал, UIStepper не регистрирует никаких событий.

Мой код следующий

init(variableIndex: Int, variableName: String, withParentView parent: UIView, currentValue: String, readOnly: Bool) {
    // Instantiate the properties
    valueTextField = UITextField()
    valueStepper = UIStepper()
    numberOfDecimals = currentValue.components(separatedBy: ".").count > 1 ? currentValue.components(separatedBy: ".")[1].count : 1
    numericValue = Double(currentValue)!
    super.init(variableIndex: variableIndex, variableName: variableName, withParentView: parent)

    // Horizontal Stack View
    let horizontalStackView = UIStackView()
    horizontalStackView.axis = .horizontal
    horizontalStackView.alignment = .fill
    horizontalStackView.spacing = 15
    horizontalStackView.distribution = .fill
    horizontalStackView.translatesAutoresizingMaskIntoConstraints = false
    horizontalStackView.isUserInteractionEnabled = true

    // Text Field
    valueTextField.text = stringValue
    valueTextField.textAlignment = .right
    valueTextField.layer.borderWidth = 1.0
    valueTextField.layer.cornerRadius = 6.0
    valueTextField.layer.borderColor = UIColor.darkGray.cgColor
    #warning ("TODO: Enable interaction, change keyboard to numeric and add done button to keyboard")
    valueTextField.isUserInteractionEnabled = false
    valueTextField.rightView = UIView(frame: CGRect(x: 0, y: 0, width: ConfigFile.rightPadding, height: Int(valueTextField.frame.size.height)))
    valueTextField.rightViewMode = .always

    // Stepper
    valueStepper.value = numericValue
    valueStepper.stepValue = 0.1
    valueStepper.addTarget(self, action: #selector(self.stepperValueChanged(sender:)), for: .touchUpInside)
    valueStepper.addTarget(self, action: #selector(self.test(sender:)), for: .allEditingEvents)
    valueStepper.isEnabled = !readOnly

    // Create the constraints
    constraints.append(NSLayoutConstraint(item: horizontalStackView, attribute: .width, relatedBy: .equal, toItem: stackView, attribute: .width, multiplier: 1.0, constant: 0.0))

    horizontalStackView.addArrangedSubview(valueTextField)
    horizontalStackView.addArrangedSubview(valueStepper)
    stackView.addArrangedSubview(horizontalStackView)
}

@objc private func stepperValueChanged(sender: UIStepper) {
    numericValue = valueStepper.value
    let userInfo = [
        "VariableIndex": String(self.variableIndex),
        "NewValue": self.stringValue
    ]
    NotificationCenter.default.post(name: .numericVariableChanged, object: nil, userInfo: userInfo)
}

@objc private func test(sender: UIStepper) {
    print("Hi")
}

Как видите, я добавляю события строками

valueStepper.addTarget(self, action: #selector(self.stepperValueChanged(sender:)), for: .touchUpInside)
valueStepper.addTarget(self, action: #selector(self.test(sender:)), for: .allEditingEvents)

Я также пытался использовать аргумент .allTouchEvents во второй строке, но это не сработало.

Все представления над UIStepper имеют свойство isUserInteractionEnabled, установленное на true.

Во время выполнения я получаю обратную связь от UIStepper, когда нажимаю его (он на мгновение меняет цвет).


person Carlos M.    schedule 20.03.2019    source источник


Ответы (2)


Используйте событие .valueChanged с UIStepper, а не .touchUpInside или .allEditingEvents.

person rmaddy    schedule 20.03.2019
comment
@Карлос М. Это как минимум половина проблемы. Обратите внимание, что никто не мог знать другую половину проблемы, основываясь на коде, который вы разместили в своем вопросе. - person rmaddy; 20.03.2019
comment
Вы правы, я сделал предыдущий комментарий до того, как нашел проблему. Спасибо за ваш ответ. - person Carlos M.; 20.03.2019

У меня была та же проблема, что и описанная в здесь

Проблема заключалась в том, что у меня не было никакой ссылки на объект, который я генерировал, поэтому он немедленно деинициализировался. Я решил это, сохранив ссылку на него в ViewController, который его содержит.

person Carlos M.    schedule 20.03.2019