【问题标题】:Disappearing UITextField text消失的 UITextField 文本
【发布时间】:2014-03-19 01:34:09
【问题描述】:

我遇到的问题是 UITextField 中的文本在 iOS 上每隔一个键盘点击就会消失。这个问题在多个视图控制器中发生过,但以前我已经能够通过使文本字段更高来解决这个问题,给它更多的空间来绘制里面的文本。

该解决方案不适用于这种特殊情况。我正在为我的应用程序使用自定义字体,因此我使用 UITextField 的子类作为自动设置自定义字体的文本字段。我已经尝试恢复到基本的 UITextField,但这并不能解决问题。

我还尝试注释掉我在问题视图控制器中实现的委托方法,但这并不能解决我的问题。我真的不知道还能尝试什么,所以我希望这里的其他人能指出我正确的方向。以下是迄今为止我发现的关于我的问题的一些事情:

  1. 文本会随着每次按键而消失并重新出现,尽管点击退格按钮不会改变文本的外观/消失(即,如果在文本可见时点击退格,则文本会被正常删除。如果在文本显示时点击隐藏,字符从文本字段的文本中删除,但用户看不到发生了什么)
  2. 当文本可见且文本字段是第一响应者时,文本会显示在文本字段的底部
  3. 当不同的文本字段成为第一响应者时,有问题的文本字段中的文本将被正确绘制,在文本字段中垂直居中,并且始终可见。
  4. 当文本字段中已有文本时,将其设为第一响应者将导致文本重绘并显示为好像在文本字段中向上/向下滚动一样。文本将交替绘制在文本字段的中心并向下“滚动”出视图,或者绘制出视图并向上“滚动”到视图中,停留在文本字段的底部。
  5. 视图控制器仅在其呈现的两种模式之一中存在问题。它要么以模态方式呈现为 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


【解决方案1】:

我在这里遇到了同样的问题,在以前的版本中没有。 多亏了我测试过的项目,我发现问题出在显示嵌入在带有半透明导航栏的导航控制器中的视图控制器。

我在我展示的导航控制器的模拟指标中设置了不透明栏,并且 UITextField 不再有问题。

至少在我的情况下,当我在 InterfaceBuilder 中为我的 UINavigationController 的模拟指标中为顶部栏设置不透明栏时,一切都已解决,该 UINavigationController 嵌入了我想以模态方式呈现的 UIViewController

希望你也一样。

【讨论】:

  • 多么烦人的错误:(
【解决方案2】:

我遇到了类似的问题,UITextField 可以正常显示文本,但是当我从后台返回时,它没有显示文本,并且文本字段似乎没有响应。但是,我注意到它实际上是在接受输入。它只是不可见。在 xcode 的首次亮相模式下显示视图显示文本字段已向下移动并在其他视图下分层并且不可见。就我而言,我将 AutomaticallyAdjustScrollViewInsets 禁用为 NO,问题就解决了!

【讨论】:

  • 奇怪,但它也对我有用。这非常奇怪,因为我的视图甚至没有滚动视图,并且文本字段位于堆栈视图中。
【解决方案3】:

我在我的应用程序中的两个搜索栏和几个 UITextField 上遇到了完全相同的问题。它似乎莫名其妙地来来去去,并且发生在模拟器中的多种设备类型和多个真实设备上。重新启动实际手机似乎使问题在手机上安装的应用程序中消失。我猜这是 Apple 的错误……但我真的没有线索,而且这里的解决方案似乎都无法解决这个问题。

更新

好的,我可能已经解决了...我有一个显示在此文本字段之前的登录控制器,我发现如果我在该登录控制器上打开键盘(就像我不只是预先填写用户名和密码)然后出现此行为。但如果我不打开键盘,那就完全没问题了。

更新 2 -- 已解决!!

所以事实证明,当登录控制器中的用户或密码文本字段被选中时,其中一个成为第一响应者。当用户点击 Login 并且视图消失时,这些字段永远不会放弃成为第一响应者,因此它使键盘在应用程序的其余部分处于不断变化的状态。

在我的登录方法中让文本字段像下面这样作为第一响应者解决了这个问题:

if (_emailTextField.isFirstResponder) {
    [_emailTextField resignFirstResponder];
}

if (_passwordTextField.isFirstResponder) {
    [_passwordTextField resignFirstResponder];
}

...do login stuff

【讨论】:

    【解决方案4】:

    我有同样的问题。我在 viewDidLoad 中使用了 becomeFirstResponder 方法。但后来我觉得 becomeFirstResponder 应该在 ViewDidAppear 里面,因为当时 didLoad 方法渲染了整个视图,没有用户交互。实际的用户交互在 viewDidAppear 之后开始,所以我将 becomeFirstResponder 移到 viewDidAppear 方法中,现在一切正常。

    上一个

    -(void)viewDidLoad{
        [self viewDidLoad];
        [self.textField becomeFirstResponder];
        ......
    }
    

    之后

    -(void)viewDidAppear:(BOOL)animated{
       [self.loginTextField becomeFirstResponder];
       ...... 
    }
    

    【讨论】:

      【解决方案5】:

      这似乎是来自 Apple 的一个非常常见的错误,人们已经通过许多不同的方式解决了它。 我遇到了同样的问题。经过一些试验,我发现我的情况是因为当某些文本字段“didBeginEditing”时我隐藏了导航栏。一旦出现这个错误,它就会出现在整个应用程序中,而不仅仅是在那个控制器中。 我通过不隐藏导航栏消除了这个错误(这不是我真正想要的但别无选择)。

      希望这会对某人有所帮助。简而言之,这个错误可能由于各种原因而发生。尝试撤消一些更改,直到错误消失,然后您才知道它的确切来源。

      【讨论】:

        【解决方案6】:

        我在 UIView 上添加的一些 UITextFields 上遇到了类似的问题,发现这是我自己而不是苹果创建的错误。我在 textFieldDidBeginEditing 委托上设置 textfield.setContentScaleFactor

        [textField setContentScaleFactor:10.0];

        删除上面的行,它可以在不做任何其他事情的情况下工作。

        我的视图层次 ---> UIScrollview --> UIImageView --> UIView --> UITextField

        希望它可以帮助任何人。

        【讨论】:

          【解决方案7】:

          我遇到了类似的问题。通过为上一个屏幕退出键盘来解决它。

          前一个屏幕有一个键盘类型为Numpad 的文本字段。所以在来到文本字段闪烁的屏幕之前,我打电话给resignFirstResponder

          【讨论】:

            【解决方案8】:

            Ziewvater 的原始问题中的 EDIT 解决了我的问题。我在运行时加载了几个文本字段,每当我导航回来时,这些视图都会被释放/删除,然后每次都会实例化新的文本字段。重新加载一次后是明文,但编辑结束后会设置 textfield.text 属性,您可以看到文本。

            var responder = View.FindFirstResponder(); //(i'm in Xamarin) if(responder != null) responder.ResignFirstResponder();

            在视图中执行此操作将解决我的问题。谢谢!!!!!!!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-23
              • 1970-01-01
              相关资源
              最近更新 更多