【发布时间】:2014-03-19 01:34:09
【问题描述】:
我遇到的问题是 UITextField 中的文本在 iOS 上每隔一个键盘点击就会消失。这个问题在多个视图控制器中发生过,但以前我已经能够通过使文本字段更高来解决这个问题,给它更多的空间来绘制里面的文本。
该解决方案不适用于这种特殊情况。我正在为我的应用程序使用自定义字体,因此我使用 UITextField 的子类作为自动设置自定义字体的文本字段。我已经尝试恢复到基本的 UITextField,但这并不能解决问题。
我还尝试注释掉我在问题视图控制器中实现的委托方法,但这并不能解决我的问题。我真的不知道还能尝试什么,所以我希望这里的其他人能指出我正确的方向。以下是迄今为止我发现的关于我的问题的一些事情:
- 文本会随着每次按键而消失并重新出现,尽管点击退格按钮不会改变文本的外观/消失(即,如果在文本可见时点击退格,则文本会被正常删除。如果在文本显示时点击隐藏,字符从文本字段的文本中删除,但用户看不到发生了什么)
- 当文本可见且文本字段是第一响应者时,文本会显示在文本字段的底部
- 当不同的文本字段成为第一响应者时,有问题的文本字段中的文本将被正确绘制,在文本字段中垂直居中,并且始终可见。
- 当文本字段中已有文本时,将其设为第一响应者将导致文本重绘并显示为好像在文本字段中向上/向下滚动一样。文本将交替绘制在文本字段的中心并向下“滚动”出视图,或者绘制出视图并向上“滚动”到视图中,停留在文本字段的底部。
- 视图控制器仅在其呈现的两种模式之一中存在问题。它要么以模态方式呈现为 UINavigationController 的根视图控制器,要么被推送到以模态呈现的 UINavigationController 堆栈作为导航控制器的第三个视图控制器。在第一种情况下,它是根视图控制器,文本字段工作得非常好,并且没有表现出上述奇怪的行为。奇怪的行为在第二种情况下始终出现。
这个问题的一个很好的例子可以在这个类似问题中发布的视频中看到:UITextField text disappears on every other keystroke。问题本身的答案没有用,也不能解决我的问题。
编辑
我已经成功地重现了我之前遇到的问题。事实证明,这个问题是由于向导航控制器的视图添加了一个子视图,然后在 UITextField 处于焦点时将其删除。如果在 UITextField 没有被编辑的情况下删除子视图,则不会出现该错误。
在我的例子中,加载图像在网络调用期间作为子视图添加到导航控制器,并在所述调用完成后删除。在此期间, UITextField 将处于活动状态,这将导致我在上面描述的视觉错误。
我已在此处上传的独立示例项目中重新创建了该错误:https://www.dropbox.com/s/s4kc05vg1pwteeo/Funky%20TextField%20Tester.zip。另请注意,如果您在视图控制器的 viewDidLoad 实现中告诉 textField 成为第一响应者,则此错误将在开始时发生并持续存在。
新问题
避免将加载视图放在导航控制器的视图中对我来说很容易,但这样做会给我一个很好的效果,即让加载视图“浮动”在屏幕上的同一位置,而将其放入导航堆栈上的视图控制器视图引发了一系列视觉问题(当视图控制器被推入堆栈时移动加载视图位置,加载视图被其他视图控制器遮挡等)。
有没有什么方法可以在不将视图放入导航控制器的视图的情况下重现这种外观,或者可能是一种安全的方法将其放入导航控制器的视图中而不执行奇怪的变通办法,例如在子视图的展示?
【问题讨论】:
-
如果您可以发布一个可重现问题的示例项目,这将有助于更快地找到问题。
-
我希望可以,但在这个特定实例之外,我无法重现该问题。我仍在调查这个问题,所以如果我找到重现它的方法,我会在这里发布。如果您对可能的调查途径有任何建议,我们将不胜感激。
-
我唯一能想到的就是你的
textField:shouldChangeCharactersInRange:replacementString:方法中的一个问题,如果你已经实现了它的话。不过,一般来说,您很可能需要提供一些代码或示例项目来解决此问题。 -
我没有在相关的视图控制器中实现
textField:shouldChangeCharactersInRange:replacementString:。如果有帮助,我会转储视图控制器代码供大家查看。有没有人可以推荐的网站? -
Dropbox。压缩这些文件,将存档放入 Public 文件夹并共享该链接。
标签: ios iphone objective-c uitextfield