Extend UITextFieldDelegate
.
extension UITextFieldDelegate {
func setReturnKeyState(for textField: UITextField, isEnabled: Bool, delay: Double? = nil) {
textField.enablesReturnKeyAutomatically = false
if textField.delegate != nil {
if let delay = delay {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
textField.setValue(isEnabled, forKeyPath: "inputDelegate.returnKeyEnabled")
}
} else {
textField.setValue(isEnabled, forKeyPath: "inputDelegate.returnKeyEnabled")
}
}
}
}
Define validation rule.
private func isValidEmail(_ input: String?) -> Bool {
guard let input = input else { return false }
let emailRegex = try! NSRegularExpression(pattern: ".+@.+\\..+")
let fullNSRange = NSRange(input.startIndex..., in: input)
return emailRegex.rangeOfFirstMatch(in: input, options: .anchored, range: fullNSRange) == fullNSRange
}
In UITextFieldDelegate
's methods use setReturnKeyState(for textField: ...)
.
func textFieldDidBeginEditing(_ textField: UITextField) {
setReturnKeyState(for: textField, isEnabled: isValidEmail(textField.text), delay: 0.1) // A bit hacky it needs delay here
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if var text = textField.text, let range = Range(range, in: text) {
text.replaceSubrange(range, with: string)
setReturnKeyState(for: textField, isEnabled: isValidEmail(text))
}
return true
}