消失的UITextField文本

时间:2014-03-19 01:34:10

标签: ios iphone objective-c uitextfield

我遇到的问题是UITextField中的文本在iOS上的所有其他键盘点击中消失。这个问题发生在多个视图控制器中,但之前我已经能够通过使文本字段更高来解决问题,为其提供更多空间来绘制文本。

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

我也试过评论我在问题视图控制器中实现的委托方法,但这并没有解决我的问题。我真的不知道还有什么可以尝试,所以我希望这里的其他人可以指出我正确的方向。以下是我到目前为止发现的关于我的问题的事情:

  1. 文本消失并在每次按键时重新出现,但点按退格按钮不会改变文本的外观/消失(即,如果文本可见时点击退格,则正常删除文本。如果文本是隐藏的,字符将从文本字段的文本中删除,但用户无法看到正在发生的事情)
  2. 当文本字段可见且文本字段是第一个响应者时,文本显示在文本字段的底部
  3. 当其他文本字段成为第一响应者时,有问题的文本字段中的文本将被正确绘制,在文本字段中垂直居中,并始终可见。
  4. 当文本字段中包含文本时,使文本字段成为第一响应者将导致文本重绘并显示为在文本字段中向上/向下滚动。文本将交替地在文本字段中居中绘制,并从视图中“向下滚动”,或者从视图中绘制出来并“滚动”到视图中,放在文本字段的底部。
  5. 视图控制器只在其呈现的两种模式之一中出现问题。它或者以模态方式呈现为UINavigationController的根视图控制器,或者作为导航控制器的第三个被推送到模态呈现的UINavigationController的堆栈中查看控制器。在第一种情况下,它是根视图控制器,文本字段工作得很好并且没有表现出上述的奇怪行为。在第二种情况下,奇怪的行为始终如一。
  6. 在这个类似问题中发布的视频中可以看到这个问题的一个很好的例子:UITextField text disappears on every other keystroke。问题本身的答案没有用,也没有解决我的问题。

    修改

    我成功地复制了我之前遇到过的问题。事实证明,问题是由于在导航控制器的视图中添加了子视图,然后在UITextField处于焦点时将其删除。如果在未编辑UITextField的情况下删除子视图,则不会发生错误。

    在我的情况下,在网络呼叫期间将加载图像作为子视图添加到导航控制器,并在完成所述呼叫后移除。在此期间,UITextField将处于活动状态,这将导致我在上面描述的视觉错误。

    我在我上传的独立示例项目中重新创建了错误:https://www.dropbox.com/s/s4kc05vg1pwteeo/Funky%20TextField%20Tester.zip。另请注意,如果您告诉textField成为视图控制器的viewDidLoad实现中的第一响应者,则此错误将在开始时发生并持续存在。

    新问题

    我很容易避免将加载视图放在导航控制器的视图中,但这样做会给我一个很好的效果,即将加载视图“浮动”放在屏幕上的相同位置,而将其放入视图控制器在导航堆栈上的视图引发了一系列视觉问题(当视图控制器被压入堆栈时移动加载视图位置,加载视图被其他视图控制器遮挡等)。

    有没有办法在不将视图放入导航控制器视图的情况下重现这种外观,或者可能是一种安全的方式将其放入导航控制器的视图而不执行奇怪的解决方法,例如在所有UITextFields停止编辑子视图的演示文稿?

8 个答案:

答案 0 :(得分:7)

我在这里遇到了同样的问题,在以前的版本中没有。  感谢你的项目我已经测试过,我发现这个问题来自于一个带有半透明导航栏的导航控制器中嵌入的视图控制器。

我在我所呈现的导航控制器的模拟指标中设置了不透明条,并且UITextField没有更多问题。

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

希望你也一样。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

我在我的应用中的两个搜索栏和几个UITextFields上存在完全相同的问题。它似乎来得又莫名其妙地发生在模拟器和多个真实设备上的多种设备类型中。重新启动实际的手机似乎会在手机上安装的应用中消失。我猜这是一个Apple漏洞......但我确实没有任何线索,这里的解决方案似乎都无法解决问题。

Here's what it looks like when you're typing in the text field inside the search bar.

<强>更新

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

更新2 - 已解决!!

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

在我的登录方法中将文本字段作为第一个响应者辞职,解决了问题:

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

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

...do login stuff

答案 3 :(得分:2)

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

<强>上

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

<强>后

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

答案 4 :(得分:0)

这似乎是苹果公司常见的一个错误,人们已经用很多不同的方式解决了它。 我遇到了同样的问题。经过一些试验,我发现我的情况是因为我在某些textField&#34; didBeginEditing&#34;时隐藏了导航栏。一旦发生此错误,它就会在应用程序周围发生,而不仅仅是在该控制器中。 我没有隐藏导航栏(这不是我真正想要的但却别无选择),从而消除了这个错误。

希望这会对某人有所帮助。简而言之,这个错误可能由于各种原因而发生。尝试撤消一些更改,直到错误消失然后你知道它究竟来自哪里。

答案 5 :(得分:0)

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

[textField setContentScaleFactor:10.0];

删除上述行并且无需执行任何其他操作。

我的视图层次结构---&gt; UIScrollview - &gt; UIImageView - &gt; UIView - &gt;的UITextField

希望它可以帮助任何人。

答案 6 :(得分:0)

我有类似的问题。解决了以前屏幕的键盘问题。

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

答案 7 :(得分:0)

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

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

在viewwilldisappear中执行此操作修复了我的问题。致谢!!!!!!!