Ben Ben - 1 year ago 78
iOS Question

Executing different functions on [RETURN] keypress from different text fields

I have two text fields:

@IBOutlet weak var loginEmailInput: UITextField!
@IBOutlet weak var loginPasswordInput: UITextField!


When the
loginEmailInput
is active and the return key is pressed, I just want to close the keyboard:

func textFieldShouldReturn(loginEmailInput: UITextField) -> Bool {
loginEmailInput.resignFirstResponder()
return true
}


When the
loginPasswordInput
is active and the return key is pressed, I want to also execute the function
loginButtonPressed(...)
:

func textFieldShouldReturn(loginPasswordInput: UITextField) -> Bool {
loginPasswordInput.resignFirstResponder()
loginButtonPressed(self)
return true
}


However, I receive an error stating that I've now redeclared the
textFieldShouldReturn
function:


Invalid redeclaration of 'textFieldShouldReturn'


How can I handle the
[return]
key being pressed with different text fields active?

Answer Source

You have to define the function once and branch depending on the given sender:

func textFieldShouldReturn(sender: UITextField) -> Bool {
    if sender == loginEmailInput {
        sender.resignFirstResponder() // or loginEmailInput.resignFirstResponder()
        return true
    } else if sender == loginPasswordInput {
        sender.resignFirstResponder() // or loginPasswordInput.resignFirstResponder()
        loginButtonPressed(self)
        return true
    }
}

Alternatively use a switch case:

func textFieldShouldReturn(sender: UITextField) -> Bool {
    switch sender {
    case loginEmailInput:
        sender.resignFirstResponder() // or loginEmailInput.resignFirstResponder()
    case loginPasswordInput:
        sender.resignFirstResponder() // or loginPasswordInput.resignFirstResponder()
        loginButtonPressed(self)
    default:
        break
    }
    return true
}

If you want to remove as much redundancy as possible you could even use:

func textFieldShouldReturn(sender: UITextField) -> Bool {
    if sender == loginPasswordInput {
        loginButtonPressed(self)
    }
    return true
}

The reason the textFieldShouldReturn gets a sender passed along is exactly for this kind of situations. It is a common pattern for delegates functions to get the object passed along from where the delegate methods gets invoked to make the receiver respond to multiple instances at once.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download