Swift - validating UITextField

Solution 1:

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
    }
}

Solution 2:

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

}