UITextField text jumps

user3237732 picture user3237732 · Sep 24, 2015 · Viewed 9.5k times · Source

I have ViewController with 2 UITextField elements: Login and Password. I set delegate for these fields, which includes code below:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField === self.loginField {
        self.loginField.resignFirstResponder()
        self.passwordField.becomeFirstResponder()
        return false
    }

    return true
}

This logic should switch user from login text field to password when he presses Next button on keyboard. But I stuck with glitch: after

self.passwordField.becomeFirstResponder()

text in login field jumps to the top left corner and back. And what's more strange: this glitch reproduces only first time, then you need recreate ViewController to observe this behavior

Here is video of the glitch http://tinypic.com/player.php?v=6nsemw%3E&s=8#.VgVb3cuqpHx

I ended up with this:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField === self.loginField {
        self.loginField.resignFirstResponder()
        // Shitty workaround. Hi, Apple!
        self.loginField.setNeedsLayout()
        self.loginField.layoutIfNeeded()

        self.passwordField.becomeFirstResponder()
        return false
    }

    return true
}

Answer

Dave Batton picture Dave Batton · Oct 25, 2015

Based on some of the other ideas posted here, this is a solution that is easy to implement, works (for me) in all cases, and doesn't appear to have any side effects:

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    // Workaround for the jumping text bug.
    [textField resignFirstResponder];
    [textField layoutIfNeeded];
}

This solution works both if you're going to the next field programmatically from -textFieldShouldReturn: or if the user just touches another responder.