2012-11-16 92 views
1

我有一个注册表单,我想让键盘始终位于顶部。 我现在这样做的方式是,当用户在视图控制器之间移动时,在viewDidLoad中,第一个UITextField成为第一个响应者。 问题是,当用户在视图控制器之间移动时,键盘闪烁(消失,然后再次出现)。切换视图控制器时,iOS键盘会闪烁

此外,与此相关:我有一个形式与几个uitextfields。当用户按下时,它将使用becomefirstresponder进入下一个uitextfield。当用户在最后的文本字段中时,键盘按钮变成“完成”。然后,当用户按下它时,如果最后一个字段出现错误,它应该得到焦点(调用成为FirstResponder),但不会发生(没有得到焦点和键盘下降)。所有其他领域的焦点都很好,只是最后一个领域没有。我已经尝试了一切:切换到其他文本字段并返回。问题是完成后会自动删除键盘。

+1

第二个问题真的应该是一个单独的问题。这样人们可以回答任何问题,并且可以将其标记为正确。 – SpacyRicochet

回答

2

您应该为此做出两个单独的问题。

首先,你的闪烁:

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

但是,整个方法是hackey的一种,我不建议你使用它。相反,尝试在scrollView中使用多个视图,当您移动到新视图时,您可以更改其中的偏移量。这也将解决闪烁问题。

其次,失去firstResponder上完成状态:

完成按钮是专门有指示正是它说;完成。按下这个假定用户已经完成,并且没有文本留下来键入,因此解除了键盘。

如果您确实想保留完成按钮,请尝试以下操作;

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

这会给键盘消失之前的时间,使其再次弹出之前,所以它不会干扰becomeFirstResponder调用。

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

+0

谢谢!对这两个问题感到抱歉。只有一个问题:无形文本字段解决方案无法正常工作(仍有一些闪烁)。我做错了什么,或者只是有问题吗?恐怕,滚动视图解决方案对我来说是不可能的。 – Yaniv

+0

不用担心。我们都加入了这个网站一次。虽然闪烁不能帮助你进一步。问题在于你使用多个viewController实际上是一项任务(填写整个表单)。苹果的想法是,一个viewController存在一个单一的任务,当viewController不再是焦点时,这个viewController会停止。因此,它也会禁用当前正在进行的任何操作,例如键盘。没办法,我害怕。要么是所有的视图,要么当新的viewController出现时允许键盘消失并且很好地显示。 – SpacyRicochet