IOS 8 无法从 UITextField 关闭键盘
Posted
技术标签:
【中文标题】IOS 8 无法从 UITextField 关闭键盘【英文标题】:IOS 8 can't dismiss keyboard from UITextField 【发布时间】:2015-02-01 19:50:53 【问题描述】:我相信我的问题类似于:ios 8 Keyboard Dismissed delay after modal view controller is dismissed,但我不清楚其他线程如何在我的应用程序中解决它。
在 Xcode5/IOS7 中,我展示了一个带有 2 个 UITextField 的 UIAlertView。用户可以简单地按 OK 并继续,或者他们可以在文本字段中输入密码/确认密码。在IOS7中,当我显示alertview时我隐藏了键盘,如果/当用户点击文本字段时,键盘会自动重新出现:
UIAlertView *startTurnAlert;
UITextField *textField0, *textField1;
startTurnAlert = [[UIAlertView alloc]
initWithTitle:[NSString stringWithFormat:@"Player %d, Begin Turn %d",playerNumber, turnNumber]
message:[NSString stringWithFormat:@"%@, report for duty!", playerNames[playerNumber] ]
delegate:self
cancelButtonTitle:@"Exit Game"
otherButtonTitles:@"OK",
nil
];
startTurnAlert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
textField0 = [startTurnAlert textFieldAtIndex:0];
textField0.secureTextEntry = YES;
textField0.keyboardType = UIKeyboardTypeDefault;
textField0.placeholder = @"Enter a passcode (optional)";
textField1 = [startTurnAlert textFieldAtIndex:1];
textField1.placeholder = @"Re-enter passcode";
textField0.keyboardType = UIKeyboardTypeDefault;
[startTurnAlert show];
[textField0 endEditing:YES];
[textField1 endEditing:YES];
更新到 Xcode 6 并为 IOS8 构建后,没有代码更改,键盘永远不会隐藏。我尝试像这样添加 resignFirstResponder ,但没有运气:
[startTurnAlert show];
[textField0 resignFirstResponder];
[textField0 endEditing:YES];
[textField1 resignFirstResponder];
[textField1 endEditing:YES];
那么,在 IOS8 中,如何隐藏嵌入在 UIAlertview 中的 UItextField 的键盘直到用户实际上通过点击文本字段来指示输入文本的意图?
谢谢!
【问题讨论】:
UIAlertView 已被弃用,我怀疑这是原因,但可能是。如果您只想支持 iOS 8+,您可能需要使用 UIAlertController。它在 API 中支持文本字段。 再次查看代码后,您可能想尝试不要在显示后立即调用 endEditing,看看会发生什么。还可以尝试在调用 show 之前解散。 【参考方案1】:我遇到了同样的问题,试图隐藏 modal 弹出窗口中的键盘。 resignFirstResponder
什么都不做。
解决方案...是禁用对话框中的所有 UITextFields
控件(因此 iOS 无法锁定任何需要键盘的控件),然后重新启用相关控件几分之一秒后。
这很烦人,但它确实有效......
(叹气。)
【讨论】:
只是为了澄清:您禁用,隐藏键盘,然后重新启用?还是您禁用、重新启用然后隐藏? 不,我禁用了控件...此时屏幕键盘自动滑开了,然后,几分之一秒后,我重新启用了控件我希望用户能够在其中输入文本。 有趣。它在 ipadAir 上效果很好,只要我在显示 alertView 后延迟至少 750 毫秒,然后再重新启用文本字段。如果我尽快重新启用,键盘会在重新启用后恢复。这当然是可以接受的延迟。但是,在较旧的 32 位 iPad2 上,延迟必须至少为 5.0 秒……有时甚至高达 7.0 秒,否则键盘会弹回。我会选择 750 毫秒,只是接受速度较慢的设备不会受益。 荒谬,嘿?!请记住,Apple 在这方面的官方声明是 不可能 在模态对话框中关闭屏幕键盘。所以这个小怪癖可能会随着 iOS 9 消失。但它现在可以工作(总比没有好......) 哦...我花了几乎一天尝试各种方法来关闭键盘,直到我终于偶然发现了这个想法!因此,在我的回答中,这两段内容充满了愤怒,咒骂和拉扯!很高兴它对你有用。【参考方案2】:我不确定是否有人像我一样对 iOS9 有同样的问题,但我设法通过这种方式让它工作:
尝试专注于其中一个文本字段
[self.someTextfield becomeFirstResponder];
然后延迟它,然后移除焦点
double delayInSeconds = 0.5; // set the time
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
[self.someTextfield resignFirstResponder];
);
【讨论】:
【参考方案3】:由于它在 iOS 7 中工作并且您已经在这方面花费了一段时间,我将只实现类似问题中的第二个代码块 here 从 if [uialertcontroller 类]开始
【讨论】:
我仍然看到相同的行为。 尝试在 VC 而不是 alertView 上调用它 你实现了 textFieldShouldEndEditing 吗? 是的,但仍然没有运气。我应该在 textFieldShouldEndEditing 中辞去FirstResponder 吗?还是我只返回 YES? 经过几天的断断续续实验,我放弃了。还是谢谢。以上是关于IOS 8 无法从 UITextField 关闭键盘的主要内容,如果未能解决你的问题,请参考以下文章
iOS 键盘处理(改变键盘为完成键),UITextField键盘显示隐藏,弹出,回弹
iOS之UITextField怎么自定义键盘的return键
如何创建具有适当不透明度的 UITextField 附件视图 iOS7,甚至复制键?