UITextField无法获取键盘输入

10

我在一个SVProgressHUD下的UITextField中输入文字时遇到了问题(基本上是一个UIView,带有全屏幕透明UIWindow和一些UIView子视图来显示文本和自定义绘制的进度条)。

我的问题是,虽然UITextField显示了闪烁的光标并且键盘也出现了,但是当我点击按键时,没有任何字符被输入到文本框中。我只看到光标像平常一样闪烁。有趣的是,回退(删除)键可以工作(它确实删除了UITextView中的最后一个字母),但其他任何键都不能。

我使用的是iOS 6。

非常感谢任何帮助。

编辑: 当没有SVProgressHUD显示时,同样的UITextField可以正常工作。这让我想到可能与第一响应者有关,但我已经尝试在每个窗口和SVProgressHUD的子视图上调用resignFirstResponder,但仍然不起作用。

4个回答

35
我终于找到了问题所在: SVProgressHUD在初始化时调用makeKeyAndVisible,因为它希望接收键盘通知来进行重新定位。我查了一下“关键窗口”到底是什么,发现如下描述:

...关键窗口响应用户输入...

由于SVProgressHUD的UIWindow为keyWindow,我的另一个包含UITextField的窗口没有获得用户输入。
最后我在AppDelegate的window上调用makeKeyWindow,一切都正常工作了。
希望这可以帮助遇到类似问题的人。

2
我不知道为什么这个答案到现在为止还没有几百个赞。非常感谢! - Steve Rukuts
3
就我的情况而言,恰恰相反。我的UITextField在AppDelegate所在的不同窗口中,但警报将焦点带回到了AppDelegate。对正确的UIWindow对象执行makeKeyWindow为我解决了问题。感谢你指引我正确的方向。 - redbeard
1
在我的情况下,我使用键窗口来自定义弹出窗口和进度信息。在iOS 6中,我必须显式地重置makeKeyWindow以获取键盘输入。真烦人。 - Mike M
我曾经遇到过同样的问题,不同之处在于我的UITextField是普通UITableViewCell的子视图。问题在于我从应用程序委托的方法 - (BOOL)application:didFinishLaunchingWithOptions:中显示UIAlertView。由于某种原因,在解除警报视图后,iOS没有将关键窗口设置为应用程序的窗口。这个问题只在iOS 6.1.x中出现。在iOS 6.0或iOS 7中,它是可以的。 - Tankista
挽救了我的一天。同意Steve的看法,现在应该有100多个。 - x4h1d
显示剩余3条评论

4

在显示SVProgressHUD之前,调用resignFirstResponder()以关闭键盘。


3
你是否实现了该方法?如果没有,请按照以下步骤进行操作:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

您是否需要过滤掉任何不必要的字符?如果是这样,也许过滤器过于严格了?


我不使用shouldChangeCharactersInRange(实际上是一个UITextField。抱歉,我现在已经更新了我的问题)来处理文本字段。 此外,当没有SVProgressHUD显示在上面时,同一UITextField可以正常工作。谢谢你的回答! - FD_

0

对我来说这个方法可行。

我在我的文本框委托方法中进行了更改,然后它就起作用了。

if ([textField isEqual:selectBankName])
{
   return No;
}
else if ([textField isEqual:enterAmountTextfield])
{
    return YES;
}

return NO;
}
  1. 为文本框设置代理
  2. 确保文本框的用户交互已启用。

  3. 最后,请检查您的文本框代理方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接