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

时间:2012-11-16 10:14:56

标签: ios

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

另外,与此相关:我有一个带有几个uitextfields的表单。当用户按下它时,它将使用becomefirstresponder转到下一个uitextfield。当用户位于最后一个文本字段时,键盘按钮变为“完成”。然后,当用户按下它时,如果最后一个字段出现错误,它应该获得焦点(调用becomeFirstResponder),但这不会发生(没有任何东西得到焦点,键盘也会失效)。所有其他字段的焦点都很好,只有最后一个字段没有。我已经尝试了一切:切换到其他文本区域并返回。问题是完成后会自动删除键盘。

1 个答案:

答案 0 :(得分:2)

你应该为此提出两个不同的问题。

首先,你的闪烁:

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

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

其次,在完成时丢失firstResponder状态:

完成按钮专门用于指示它所说的内容;完成。按此按钮假定用户已完成,并且没有留下任何文字进行输入,从而解除了键盘。

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

  1. 允许用户关闭键盘。
  2. 解雇后,检查最后一个字段中的错误。
  3. 如果出现错误,请尝试[lastField becomeFirstResponder],而不是致电[self performSelector:@selector(thisSelectorWillCallFirstResponder) withObject:nil afterDelay:1.0]
  4. 在方法thisSelectorWillCallFirstResponder中致电[lastField becomeFirstResponder]
  5. 这会让键盘在再次弹出之前消失,因此它不会干扰becomeFirstResponder通话。

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