добавление строки вместе с int для общего int (Swift4) - PullRequest
0 голосов
/ 13 сентября 2018

То, что я хочу сделать, это добавить 2 текстовых поля вместе, но я хочу добавить не int вместе с int.Поэтому я хочу сделать что-то вроде a + 2 = 5. Я хочу определить int a равным 3. Таким образом, a = 3, a + 2 должно быть равно 5 в текстовом поле.

@IBOutlet var txt1 : UITextfield!
@IBOutlet var txt2 : UITextfield!
@IBOutlet var total : UITextfield!

@IBAction func addTogether() {
//if txt1 = a then txt1 = 3 
}

1 Ответ

0 голосов
/ 13 сентября 2018

Ниже приведена демонстрация того, что вы описываете, без явной вставки «а» в текстовые поля. Есть 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"
            }
        }
    }


}
...