Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift - validating UITextField

I have these outlets in my app:

@IBOutlet var name1: UITextField!

@IBOutlet var name2: UITextField!

@IBOutlet var name3: UITextField!

@IBOutlet var name4: UITextField!

@IBOutlet var newButton: UIButton!

What I tried to do is the following:

Every time the user types something in one of these four UITextFields or deletes something, I want to check if any UITextField is empty

If any UITextField is empty, the button should be disabled.

If all UITextFields are set (not empty), the button should be enabled.

My code:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    setButton()

    return true
}

func setButton() {

    let inputValid = checkInput()

    if inputValid {

        newButton.enabled = true

    } else {

        newButton.enabled = false

    }

}

func checkInput() -> Bool {

    let name1Value = name1.text
    let name2Value = name2.text
    let name3Value = name3.text
    let name4Value = name4.text

    if !name1Value.isEmpty && !name2Value.isEmpty && !name3Value.isEmpty && !name4Value.isEmpty {

        return true

    }

    return false

}

Ok, it works 50% for now.

When I type one character in each UITextField, the button is still disabled.

When I add a second one to any UITextField, the button gets enabled etc...

Can anyone help me with this?

like image 497
Creative crypter Avatar asked Jul 18 '15 20:07

Creative crypter


2 Answers

Alternatively, you can use this, which is called every time a key is pressed:

name1.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
name2.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
name3.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
name4.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)


func textFieldDidChange(textField: UITextField) {
    if name1.text?.isEmpty || name2.text?.isEmpty || name3.text?.isEmpty || name4.text?.isEmpty {
        //Disable button
    } else {
        //Enable button
    }
}
like image 75
brimstone Avatar answered Oct 17 '22 16:10

brimstone


Swift 4 - Here is how I have solved it trying to avoid long conditionals - This will also allow you to do realtime validation on each individual textfield, unlike the accepted answer, you can update your UI according to what the user is typing.

let textfields : [UITextField] = [name1, name2, name3, name4]
for textfield in textfields {
  textfield.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
}


@objc func textFieldDidChange(_ textField: UITextField) {
  //set Button to false whenever they begin editing
  yourButton.isEnabled = false
  guard let first = textFields[0].text, first != "" else {
        print("textField 1 is empty")
        return
    }
    guard let second = textFields[1].text, second != "" else {
        print("textField 2 is empty")
        return
    }
    guard let third = textFields[2].text, third != "" else {
        print("textField 3 is empty")
        return
    }
    guard let forth = textFields[3].text, forth != "" else {
        print("textField 4 is empty")
        return
    }
    // set button to true whenever all textfield criteria is met.
    yourButton.isEnabled = true

}
like image 33
A. Welch Avatar answered Oct 17 '22 18:10

A. Welch