UIStepper не будет регистрировать события - PullRequest
0 голосов
/ 20 марта 2019

Я добавляю 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")
}

Как видите, я добавляю события с помощьюlines

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, когда нажимаю его (он на мгновение меняет цвет).

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

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

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

0 голосов
/ 20 марта 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...