Как отключить UIButton, пока несколько текстовых полей не будут заполнены данными (числами)? - PullRequest
1 голос
/ 24 марта 2019

В моем приложении 3 поля UITextFields, и мне нужно, чтобы пользователь заполнил, прежде чем он / она сможет увидеть UIButton, который вычислит результат.Я пробовал много разных методов, чтобы решить проблему, но они, кажется, не работают, и я не совсем понимаю некоторые из них.Я уверен, что есть простой способ сделать это.PS: я не использую раскадровку

Я уже пытался включить UITextFieldDelegate, затем писать функцию, также использовать другие способы и т. Д. *

import UIKit
let Label: UILabel = {
    let f = UILabel()
    f.text = "Label"
    return f
}()
let textFiled1: UITextField = {
    let fw = UITextField()
    fw.keyboardType = UIKeyboardType.decimalPad
    return fw
}()
let textField2: UITextField = {
    let fh = UITextField()
    fh.keyboardType = UIKeyboardType.decimalPad
    return fh
}()
let textField3: UITextField = {
    let fa = UITextField()
    fa.keyboardType = UIKeyboardType.numberPad
    return fa
}()
class ViewController: UIViewController {
    let calculateButton: UIButton = {
        let c = UIButton()
        c.setTitle("Calculate", for: .normal)
        return c
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        setupLabel()
        setupTextFieldComponents()
        setupCalculateButton()
    }
    fileprivate func setupLabel() {
        view.addSubview(fLabel)
    }
    fileprivate func setupTextFieldComponents() {
        setupTextField1()
        setupTextField2()
        setupTexrField3()
    }
    fileprivate func setupTextField1() {
        view.addSubview(textField1)
    }
    fileprivate func setupTextField2() {
        view.addSubview(textField2)
    }
    fileprivate func setupTextField3() {
        view.addSubview(textField3)
    }
    fileprivate func setupCalculateButton() {
        view.addSubview(calculateButton)
    }
    @objc func calculateButtonPressed(sender: UIButton){
        let textfield1 = Float(textField1.text!)
        let textfield2 = Float(textField2.text!)
        let textfield3 = Float(textField3.text!)
        femaleMetaLabel.text = String(111 + (1.1 * textfield1!) + (1.1 * textfield2!) - (1.1 * textfield3!))
    }
}

Пользователь долженвведите числовые данные во все три текстовых поля, чтобы рассчитать результат.Есть ли способ сделать сообщение об ошибке без сбоя приложения?

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Когда я выполняю проверку ввода текста, который включает кнопку, я обычно делаю что-то вроде этого:


@IBOutlet weak var usernameField: UITextField!
@IBOutlet weak var passwordField: UITextField!
@IBOutlet weak var submitButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    submitButton.isEnabled = false
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self,
                                           selector: #selector(validateInput(_:)),
                                           name: UITextField.textDidChangeNotification,
                                           object: usernameField)
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(validateInput(_:)),
                                           name: UITextField.textDidChangeNotification,
                                           object: passwordField)
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    NotificationCenter.default.removeObserver(self)
}

@objc func validateInput(_ sender: Any?) {

    submitButton.isEnabled = false

    if let username = usernameField.text,
        let password = passwordField.text {

        // your validation rules will be more complex than this :D
        if username.count > 0 && password.count > 0 {
            submitButton.isEnabled = true
        }
    }
}


Если вам нужно выдать предупреждение, если ввод неправильный, просто заменитевызов метода, подобного приведенному ниже, где вы проверяете ввод пользователя.

func showAlert() {

    let alert = UIAlertController(title: "Nope",
                                  message: "Your inputs were incorrect.",
                                  preferredStyle: .alert)

    alert.addAction( UIAlertAction(title: "Try again",
                                   style: .default,
                                   handler: nil) )

    self.present(alert, animated: true, completion: nil)
}
0 голосов
/ 24 марта 2019

@ Максим, ты почти на месте. Позвольте мне добавить простого делегата в ваш код для достижения вашей цели.

Добавить код в textFieldDidEndEditing делегат -

func textFieldDidEndEditing(textField: UITextField) {

    if (textField1.text?.count)! > 0 && (textField2.text?.count)! > 0 && (textField3.text?.count)! > 0 {

         calculateButton.isEnabled = true

    }else{

         calculateButton.isEnabled = false

    }
}

Теперь пришло время вычислить результат:

@objc func calculateButtonPressed(sender: UIButton){

    if let inputOne = Float(textField1.text!), let inputTwo = Float(textField2.text!), let inputThree = Float(textField3.text!) {

          femaleMetaLabel.text = String(111+(1.1*inputOne)+(1.1*inputTwo)-(1.1*inputThree))

    }else{

        let alert = UIAlertController(title: "", message: "You entered invalid inputs", preferredStyle: .alert)

        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))

        self.present(alert, animated: true)

    }
}

Надеюсь, это поможет вам. Дайте мне знать, если у вас все еще есть проблемы.

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