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

3
我有一个注册表单,并希望让键盘始终处于最上层。
我现在的做法是,在用户移动视图控制器时,在viewDidLoad中,第一个UITextField成为第一响应者。
问题是当用户在视图控制器之间移动时,键盘会闪烁(消失然后再次出现)。
另外,与此相关:我有一个包含几个UITextFields的表单。当用户按下“下一个”时,它会使用becomeFirstResponder来转到下一个UITextfield。当用户在最后一个文本字段中时,键盘按钮变为“完成”。然后,当用户按下它时,如果最后一个字段存在错误,则它应该获得焦点(调用becomeFirstResponder),但这并没有发生(没有聚焦和键盘关闭)。所有其他字段都可以正常获取焦点,只有最后一个字段不能。我已经尝试了所有方法:切换到其他文本字段并返回。问题是完成按钮会自动移除键盘。

1
第二个问题应该是一个单独的问题。这样人们就可以回答任何一个问题,你也可以标记它为正确的答案。 - SpacyRicochet
1个回答

3
您应该把这分成两个独立的问题来解决。
首先,关于屏幕闪烁:
我猜您正在使用UINavigationController。您可以在UINavigationController中添加一个不可见的UITextField,在切换到新的ViewController之前将其设置为焦点。然后,在新的ViewController出现后(viewDidAppear),将焦点设置为所需的第一个textField。
但是,整个方法有点不妥,我不建议您使用它。相反,尝试在scrollView中使用多个视图,当移动到新视图时更改偏移量。这也将解决闪烁问题。
其次,关于Done按钮取消firstResponder状态:
Done按钮存在的目的就是表示“完成”。按下此按钮意味着用户已经完成了所有输入,因此键盘应该消失。
如果您确实想要保留Done按钮,则可以尝试以下方法:
1. 允许用户取消键盘。 2. 在取消后检查最后一个字段中的错误。 3. 如果有错误,请尝试在调用[ lastField becomeFirstResponder ]之前调用[ self performSelector:@selector(thisSelectorWillCallFirstResponder)withObject:nil afterDelay:1.0]。 4. 在方法thisSelectorWillCallFirstResponder中调用[lastField becomeFirstResponder]。
这样可以给键盘消失一些时间,然后再弹出它,使其不会干扰becomeFirstResponder调用。
另一种方法是不使用Done按钮,而是使用return键。您可以通过delegate方法textFieldShouldReturn:拦截回车键。在那里,您可以处理任何错误检查,而不会使textField失去焦点。

谢谢!对于两个问题感到抱歉。只有一个问题:不可见文本字段的解决方案并不完美(仍然会有一些闪烁)。我是做错了什么还是它本身就有问题?滚动视图的解决方案对我来说不可行,恐怕。 - Yaniv
没关系,我们都曾经加入过这个网站。不过我无法帮你解决闪烁的问题。问题在于你为一个任务(填写整个表单)使用了多个视图控制器。苹果的想法是,一个视图控制器存在于一个单一的任务中,并且当视图控制器不再是焦点时就会停止。因此,它还会禁用任何正在进行的事情,比如键盘。恐怕没有办法绕过这个问题。要么所有内容都在一个视图中,要么允许键盘在新的视图控制器出现时消失并漂亮地重新出现。 - SpacyRicochet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接