0

I have a couple of UITextFields in a static tableviewcontroller. I have specified a tag value for each textfield so that when the user clicks next on the keyboard I can get the textfield with the next tag and call becomesFirstResponder so that the user would navigate between textfields.

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let tag = textField.tag
    if let tf = self.view.viewWithTag(tag + 1) as? UITextField {
         tf.becomeFirstResponder()
     }
}

This would essentially work. However, when I use ReactiveKit/Bond, specifically when I call the following line (assuming that lastName is the next textfield) in viewdidload to bind the UI with the model:

profile.lastName.bidirectionalBind(to: lastName.reactive.text)

The next textfield (lastName) would become in edit mode for a couple of milliseconds then the keyboard is dismissed and the textfield is not in edit mode anymore.

When I comment out the bond line the logic would succeed. I have tried replacing the bidirectional bond with a 1-way bond or calling obserNext but this would cause the same problem as well.

Essam Ewaisha
  • 439
  • 5
  • 15

2 Answers2

1

After a while of searching, debugging, and playing around, I have changed the line that calls becomeFirstResponder to be dispatched asynchronously and ironically this makes it work. Yet, I have no idea why. I found this solution in the answer here (for a different reactive library).

Updated Code:

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
   let tag = textField.tag
    if let tf = self.view.viewWithTag(tag + 1) as? UITextField {
            DispatchQueue.main.async {
                tf.becomeFirstResponder()
            }
        }
}
Essam Ewaisha
  • 439
  • 5
  • 15
0
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let tf = self.view.viewWithTag(textField.tag + 1) as? UITextField {
        tf.becomeFirstResponder()
        return false
    }
    return true
}

Try this code. You don't need to explicitly call resignFirstResponder() on current textField. Calling becomeFirstResponder() should be enough.

Maksym Musiienko
  • 1,248
  • 8
  • 16