当我使用 ReactiveKit/Bond 调用 becomeFirstResponder 后,UITextField 立即退出第一响应者
UITextField resigns first responder right after I call becomeFirstResponder when I use ReactiveKit/Bond
我在静态 tableviewcontroller 中有几个 UITextField。我为每个文本字段指定了一个标签值,这样当用户在键盘上单击下一步时,我可以获得带有下一个标签的文本字段并调用 becomesFirstResponder 以便用户可以在文本字段之间导航。
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
let tag = textField.tag
if let tf = self.view.viewWithTag(tag + 1) as? UITextField {
tf.becomeFirstResponder()
}
}
这基本上可以工作。但是,当我使用 ReactiveKit/Bond 时,特别是当我在 viewdidload 中调用以下行(假设 lastName 是下一个文本字段)以将 UI 与模型绑定时:
profile.lastName.bidirectionalBind(to: lastName.reactive.text)
下一个文本字段 (lastName) 将进入编辑模式几毫秒,然后键盘消失,文本字段不再处于编辑模式。
当我注释掉绑定线时,逻辑就会成功。我试过用单向键替换双向键或调用 obserNext 但这也会导致同样的问题。
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if let tf = self.view.viewWithTag(textField.tag + 1) as? UITextField {
tf.becomeFirstResponder()
return false
}
return true
}
试试这个代码。您不需要在当前文本字段上显式调用 resignFirstResponder()
。调用 becomeFirstResponder()
应该足够了。
经过一段时间的搜索、调试和尝试,我将调用 becomeFirstResponder 的行更改为异步调度,具有讽刺意味的是,这使它起作用了。然而,我不知道为什么。我在答案 here 中找到了这个解决方案(对于不同的反应库)。
更新代码:
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
let tag = textField.tag
if let tf = self.view.viewWithTag(tag + 1) as? UITextField {
DispatchQueue.main.async {
tf.becomeFirstResponder()
}
}
}
我在静态 tableviewcontroller 中有几个 UITextField。我为每个文本字段指定了一个标签值,这样当用户在键盘上单击下一步时,我可以获得带有下一个标签的文本字段并调用 becomesFirstResponder 以便用户可以在文本字段之间导航。
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
let tag = textField.tag
if let tf = self.view.viewWithTag(tag + 1) as? UITextField {
tf.becomeFirstResponder()
}
}
这基本上可以工作。但是,当我使用 ReactiveKit/Bond 时,特别是当我在 viewdidload 中调用以下行(假设 lastName 是下一个文本字段)以将 UI 与模型绑定时:
profile.lastName.bidirectionalBind(to: lastName.reactive.text)
下一个文本字段 (lastName) 将进入编辑模式几毫秒,然后键盘消失,文本字段不再处于编辑模式。
当我注释掉绑定线时,逻辑就会成功。我试过用单向键替换双向键或调用 obserNext 但这也会导致同样的问题。
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if let tf = self.view.viewWithTag(textField.tag + 1) as? UITextField {
tf.becomeFirstResponder()
return false
}
return true
}
试试这个代码。您不需要在当前文本字段上显式调用 resignFirstResponder()
。调用 becomeFirstResponder()
应该足够了。
经过一段时间的搜索、调试和尝试,我将调用 becomeFirstResponder 的行更改为异步调度,具有讽刺意味的是,这使它起作用了。然而,我不知道为什么。我在答案 here 中找到了这个解决方案(对于不同的反应库)。
更新代码:
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
let tag = textField.tag
if let tf = self.view.viewWithTag(tag + 1) as? UITextField {
DispatchQueue.main.async {
tf.becomeFirstResponder()
}
}
}