Ниже приведена демонстрация того, что вы описываете, без явной вставки «а» в текстовые поля. Есть 3 поля, которые имеют правило a + b = sum
. Какие из них будут изменены, зависит от того, какие поля вы редактировали. Поэтому, если вы установите a
, а затем b
, вы увидите, что sum
изменяется. Если вы затем начнете редактировать sum
, вы увидите a
, измененный в зависимости от b
и sum
.
Все сделано в коде только для демонстрации, поэтому вам предлагается создать новый проект и заменить ваш ViewController
на этот код и попробовать его. Я надеюсь, что этого достаточно, чтобы вы встали на путь, который вам нужен, но учтите, что для создания такой системы, как правило, требуется немало работы для ее совершенствования.
import UIKit
class ViewController: UIViewController {
private var firstField: UITextField!
private var secondField: UITextField!
private var sumField: UITextField!
private var currentlyUsedField: UITextField?
private var previouslyUsedField: UITextField?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(white: 0.92, alpha: 1.0)
self.firstField = {
let field = UITextField(frame: CGRect(x: 12.0, y: 60.0 + (44.0+12.0)*0.0, width: view.bounds.width-24.0, height: 44.0))
field.keyboardType = .decimalPad
field.backgroundColor = UIColor.white
field.addTarget(self, action: #selector(onFieldDidChange), for: .editingChanged)
view.addSubview(field)
return field
}()
self.secondField = {
let field = UITextField(frame: CGRect(x: 12.0, y: 60.0 + (44.0+12.0)*1.0, width: view.bounds.width-24.0, height: 44.0))
field.keyboardType = .decimalPad
field.backgroundColor = UIColor.white
field.addTarget(self, action: #selector(onFieldDidChange), for: .editingChanged)
view.addSubview(field)
return field
}()
self.sumField = {
let field = UITextField(frame: CGRect(x: 12.0, y: 60.0 + (44.0+12.0)*2.0, width: view.bounds.width-24.0, height: 44.0))
field.keyboardType = .decimalPad
field.backgroundColor = UIColor.white
field.addTarget(self, action: #selector(onFieldDidChange), for: .editingChanged)
view.addSubview(field)
return field
}()
}
private func convertStringToDouble(_ string: String?) -> Double? {
// Maybe use some formatters here
let number = NSDecimalNumber(string: string)
let doubleNumber = number.doubleValue
return doubleNumber.isNaN ? nil : doubleNumber
}
private func convertDoubleToString(_ value: Double) -> String {
// Maybe use some formatters here
return String(value)
}
@objc private func onFieldDidChange(_ sender: UITextField) {
// Check if we need to update a chain of used fields
if sender !== currentlyUsedField {
previouslyUsedField = currentlyUsedField
currentlyUsedField = sender
}
// At least 2 fields must have been modified
guard let currentlyUsedField = currentlyUsedField, let previouslyUsedField = previouslyUsedField else { return }
// We need to know if field we are modifying is a sum or not
let fieldToModify = [firstField, secondField, sumField].filter { $0 !== currentlyUsedField && $0 != previouslyUsedField }.first!
if fieldToModify === sumField {
// Show the sum
if let left = convertStringToDouble(previouslyUsedField.text), let right = convertStringToDouble(currentlyUsedField.text) {
fieldToModify?.text = convertDoubleToString(left+right)
} else {
fieldToModify?.text = "UNDEFINED"
}
} else {
let leftField: UITextField = fieldToModify == firstField ? secondField : firstField
if let sum = convertStringToDouble(sumField.text), let subtract = convertStringToDouble(leftField.text) {
fieldToModify?.text = convertDoubleToString(sum-subtract)
} else {
fieldToModify?.text = "UNDEFINED"
}
}
}
}