您应该为此提出两个单独的问题。
首先,你的闪烁:
我猜你正在使用 UINavigationController。您可以在 UINavigationController 中的某处添加一个不可见的 UITextField,在切换到新的 ViewController 之前将其聚焦。然后,当新的 ViewController 出现时 ( viewDidAppear
),根据需要将焦点设置到第一个 textField。
但是,整个方法有点老套,我不建议您使用它。相反,请尝试在 scrollView 中使用多个视图,当您移动到新视图时,您会更改其中的偏移量。这也将解决闪烁。
其次,在 Done 上失去 firstResponder 状态:
完成按钮专门用于指示它所说的内容;完毕。按下此按钮假定用户已完成并且没有文本可输入,从而关闭键盘。
如果您真的想保留“完成”按钮,请尝试以下操作;
- 允许用户关闭键盘。
- 解雇后,检查最后一个字段中的错误。
- 如果出现错误,不要调用
[lastField becomeFirstResponder]
,而是尝试[self performSelector:@selector(thisSelectorWillCallFirstResponder) withObject:nil afterDelay:1.0]
。
- 在方法
thisSelectorWillCallFirstResponder
调用[lastField becomeFirstResponder]
中。
这将使键盘有时间消失,然后再次弹出,因此不会干扰becomeFirstResponder
通话。
另一种方法是不使用完成按钮,而是使用返回键。您可以随时使用委托方法拦截返回textFieldShouldReturn:
。在那里您可以处理任何错误检查,而不会导致 textField 失去焦点。