iOS键盘在切换视图控制器时闪烁



我有一个注册表单,我想让键盘一直在上面。我现在的做法是,当用户在视图控制器之间移动时,在viewDidLoad中,第一个UITextField将成为第一个响应程序。问题是,当用户在视图控制器之间移动时,键盘会闪烁(消失,然后再次出现)。

此外,与此相关:我有一个包含一些uitextfield的表单。当用户按下next时,它使用becomefirstresponser进入下一个uitext字段。当用户处于最后一个文本字段时,键盘按钮变为"完成"。然后,当用户按下它时,如果最后一个字段出现错误,它应该会得到焦点(调用成为FirstResponder),但这并没有发生(没有得到焦点,键盘也坏了)。所有其他字段的焦点都很好,只有最后一个字段没有。我已经尝试了所有的方法:切换到其他文本字段并返回。问题是这样做会自动删除键盘。

您应该对此提出两个单独的问题。

首先,你的闪烁:

我猜您使用的是UINavigationController。您可以在UINavigationController中的某个位置添加一个不可见的UITextField,在切换到新的ViewController之前,您可以对其进行聚焦。然后,当出现新的ViewController(viewDidAppear)时,根据需要将焦点设置为第一个textField。

然而,整个方法有点技巧,我不建议你使用它。相反,试着在scrollView中使用几个视图,当你移动到新视图时,可以更改其中的偏移量。这也将解决闪烁问题。

第二,在完成时失去第一响应程序状态:

done按钮专门用于指示它所说的内容;完成。按下此键假定用户已完成,并且没有任何文本可供键入,从而取消键盘。

如果您真的想保留"完成"按钮,请尝试以下操作;

  1. 允许用户关闭键盘
  2. 解雇后,请检查最后一个字段中的错误
  3. 如果出现错误,请尝试[self performSelector:@selector(thisSelectorWillCallFirstResponder) withObject:nil afterDelay:1.0],而不是调用[lastField becomeFirstResponder]
  4. 在方法thisSelectorWillCallFirstResponder中,调用[lastField becomeFirstResponder]

这将使键盘在再次弹出之前有时间消失,这样就不会干扰becomeFirstResponder调用。

另一种方法是不使用Done按钮,而是使用return键。您可以使用委托方法textFieldShouldReturn:随时拦截返回。在那里,您可以处理任何错误检查,而不会导致textField失去焦点。

最新更新