Расчет одним ключевым нажатием позади

Я работаю над довольно простым приложением для расчета расхода топлива. Код должен преобразовать все числа в 1000 и выше, чтобы тысячи цифр использовали другой шрифт (больший), чем сотни. Я успешно справился с этим с помощью сообщества, спасибо!

Тем не менее, когда поля нажаты и введены цифры, это похоже на то, что нажатие клавиш отстает один раз за все время, что делает неправильный расчет и attributedString функции не отображаются правильно (даже если это закодировано правильно). При нажатии за пределами клавиатуры последний штрих отображается в поле, но не рассчитывается в функции. Так, например, ввод 1 показывает 1 в редактируемом поле, но все равно 0 в целом. Ввод другого 1 правильно показывает 11 в редактируемом поле, но всего 1 (предыдущий ход клавиши). Добавление еще 1 и постукивание за пределами поля показывает 111 в первом поле, но всего 11 (в то время как он должен показать тот же 111). Простое нажатие на второе поле неожиданно вычисляет правильное значение в общей сложности до 111, но при вводе большего числа номеров возникает та же "задержка" при вызове функции...

Я не вижу, что не так с кодом, но я подозреваю, что это что-то с делегатом. Функции не вызывается до второго нажатия на клавиатуру...

func textFieldDidBeginEditing(_ textField: UITextField) {
    if (textField == main1Field) {
        main1Field.text = ""
    } else if (textField == main2Field) {
        main2Field.text = ""
    } else if (textField == centerField) {
        centerField.text = ""
    }
}

//Change font when number input exceeds 3 digits
func getAttributedString(for number: Int) -> NSAttributedString {

    let defaultAttributes = [
        NSAttributedString.Key.font: UIFont(name: "font1", size: 50.0)!
    ]
    let bigNumberAttributes = [
        NSAttributedString.Key.font: UIFont(name: "font2", size: 50.0)!
    ]

    let attributedString = NSMutableAttributedString(string: "\(number)", attributes: defaultAttributes)
    if attributedString.length > 3 {
        let range = NSMakeRange(0, attributedString.length - 3)
        attributedString.setAttributes(bigNumberAttributes, range: range)
    }

    return attributedString
}

//Real-time calculation of entries made to the fields and output it live to the total
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    //Convert the String inserted into the fields into Int and create variables
    let centerFuel = Int(centerField.text!) ?? 0
    let main1Fuel = Int(main1Field.text!) ?? 0
    let main2Fuel = Int(main2Field.text!) ?? 0

    centerField.attributedText = getAttributedString(for: centerFuel)
    main1Field.attributedText = getAttributedString(for: main1Fuel)
    main2Field.attributedText = getAttributedString(for: main2Fuel)

    if centerFuel == 0 && main1Fuel == 0 && main2Fuel == 0 {
        let total = 0
        totalField.attributedText = getAttributedString(for: total)
    } else if (main1Fuel > 0 || main2Fuel > 0) && centerFuel == 0 {
        let total = main1Fuel + main2Fuel
        totalField.attributedText = getAttributedString(for: total)
    } else {
        let total = centerFuel + main1Fuel + main2Fuel
        totalField.attributedText = getAttributedString(for: total)
    }

    return true
}

//Hide keyboard when hitting Return
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}

//Hide keyboard when tapping outside of field
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

0 ответов

Другие вопросы по тегам