切换 View Controller 时 iOS 键盘闪烁

标签 ios

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

此外,与此相关:我有一个带有几个 uitextfields 的表单。当用户按下下一步时,它会使用成为第一响应者转到下一个 uitextfield。当用户在最后一个文本字段中时,键盘按钮变为“完成”。然后,当用户按下它时,如果最后一个字段有错误,它应该获得焦点(调用 becomeFirstResponder),但这并没有发生(没有获得焦点并且键盘按下)。所有其他字段都很好地聚焦,只有最后一个字段没有。我已经尝试了一切:切换到其他文本字段并返回。问题是 done 会自动移除键盘。

最佳答案

你应该为此提出两个单独的问题。

首先,你的闪烁:

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

但是,整个方法有点乱,我不建议您使用它。相反,请尝试在 scrollView 中使用多个 View ,当您移动到新 View 时,您会更改其偏移量。这也将解决闪烁问题。

其次,在 Done 上失去 firstResponder 状态:

完成按钮专门用于指示它所说的内容;完毕。按下此按钮会假定用户已完成并且没有剩余文本可供键入,因此会关闭键盘。

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

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

这会在键盘再次弹出之前留出时间让键盘消失,因此它不会干扰 becomeFirstResponder 调用。

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

关于切换 View Controller 时 iOS 键盘闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414466/

相关文章:

ios - iOS8 中自定义容器 View Controller 的 transitionCoordinator 返回 nil

ios - 无法访问 CFStreamCreatePairWithSocketToHost 上的 exc_i386_gpflt

iphone - UITableView 粘性页脚/自定义工具栏实现

ios - 访问 UITableView Cell 标签文本并在方法中使用它

iphone - 当应用程序在后台或设备被锁定时运行代码

ios - 在 MapBox 上平移时 RMPolylineAnnotation 外观发生变化

ios - xcodebuild 相当于 Xcode 的 "Product > Build For > Testing"

ios - 地理围栏 UILocalNotification 无法快速正常工作

ios - 触摸 map 时 MKUserLocation 停止更新

ios - 向 UILabel 添加可点击边距