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