Как я могу отключить UIButton, пока несколько текстовых полей не будут заполнены данными (числами)?

#ios #swift #iphone

#iOS #swift #iPhone

Вопрос:

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

Я уже пытался включить 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!))
    }
}
  

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

Комментарии:

1. Наш код представляет собой полный беспорядок. Можете ли вы отредактировать его, чтобы сделать его читаемым?

Ответ №1:

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

 
@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 amp;amp; 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)
}
  

Ответ №2:

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

Добавьте код в свой textFieldDidEndEditing делегат —

 func textFieldDidEndEditing(textField: UITextField) {

    if (textField1.text?.count)! > 0 amp;amp; (textField2.text?.count)! > 0 amp;amp; (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)

    }
}
  

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