Расчет одним ключевым нажатием позади
Я работаю над довольно простым приложением для расчета расхода топлива. Код должен преобразовать все числа в 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)
}