0

I have outlets to 3 textfields in my code as follows :

    @IBOutlet var oldPasswordTextField: UITextField! { didSet { oldPasswordTextField.delegate = self } }
@IBOutlet var newPasswordTextField: UITextField! { didSet { newPasswordTextField.delegate = self } }
@IBOutlet var confirmPasswordTextField: UITextField! { didSet { confirmPasswordTextField.delegate = self } }

In my textFieldShouldReturn delegate method, I want to make the next textfield as the first responder on click of return as follows :

    func textFieldShouldReturn(textField: UITextField) -> Bool {   //delegate method
    textField.resignFirstResponder()

    if textField == oldPasswordTextField
    {
        newPasswordTextField.becomeFirstResponder()
    }
    else if textField == newPasswordTextField
    {
        confirmPasswordTextField.becomeFirstResponder()
    }
    else
    {
        saveButtonTapped()
    }
    return true
}

But it wasn't working. So I tried to check what was going wrong. So I tried this :

    func textFieldShouldReturn(textField: UITextField) -> Bool {   //delegate method
    if textField.canResignFirstResponder()
    {
        print("textField can resign first responder")
        if textField.resignFirstResponder() == true
        {
            print("textField resigned first responder")
        }
        else
        {
            print("textField didnt resign first responder")
        }
    }
    else
    {
        print("textField cant resign first responder")
    }

    if textField == oldPasswordTextField
    {
        if newPasswordTextField.canBecomeFirstResponder() == true
        {
            if newPasswordTextField.becomeFirstResponder() == true
            {
                print("newPassword field has become first responder")
            }
            else
            {
                print("newPassword field cannot become first responder")
            }
        }

    }
    else if textField == newPasswordTextField
    {
        confirmPasswordTextField.becomeFirstResponder()
    }
    else
    {
        saveButtonTapped()
    }
    return true
}

And overtime I get "textField cant resign first responder" "newPassword field cannot become first responder" on my console. I don't know whats going wrong here. Why are the canResignFirstResponder() method and becomeFirstResponder() methods returning false? Any help?

Priyanka
  • 492
  • 1
  • 5
  • 13
  • nothing seems wrong and the same code is working fine for me. – Mathews Apr 06 '16 at 07:19
  • Got it. The mistake in my code was that my 'textFieldShouldEndEditing' method was returning false which was why my resignFirstResponder method was returning false and it wasn't working. So I made that return true and it works fine. :) – Priyanka Apr 06 '16 at 08:44

2 Answers2

0

Try to use tags in your text fields. This worked for me:

    - (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    NSInteger nextTag = textField.tag + 1;
    // Try to find next responder
    UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
    if (nextResponder) {
        // Found next responder, so set it.
        [nextResponder becomeFirstResponder];
    } else {
        // Not found, so remove keyboard.
        [textField resignFirstResponder];
    }
    return NO; // We do not want UITextField to insert line-breaks.
}

Sorry I didn't see it wasn't Objective-C, in swift it would be:

func textFieldShouldReturn(textField: UITextField!) -> Bool {
    let nextTag:Int = textField.tag + 1
    // Try to find next responder
    if let nextResponder: UIResponder! = textField.superview!.viewWithTag(nextTag){
        nextResponder.becomeFirstResponder()
    } else {
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
    }
    return false; // We do not want UITextField to insert line-breaks.
}

I found the solution here: Switching between Text fields on pressing return key in Swift

Community
  • 1
  • 1
OxyFlax
  • 441
  • 1
  • 5
  • 16
0

Got it. The above code is fine. The mistake in my code was that my 'textFieldShouldEndEditing' method was returning false which was why my resignFirstResponder method was returning false and it wasn't working. So I made the 'textFieldShouldEndEditing' method return true and it works fine. :)

    func textFieldShouldEndEditing(textField: UITextField) -> Bool {  //delegate method
    return true
}
Priyanka
  • 492
  • 1
  • 5
  • 13