UIAlertView的文本字段在iOS8中不显示键盘

@implementation UIAlertView *query; @end - (void)viewWillAppear:(BOOL)animated { query = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"New", @"") message:nil delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel", nil) otherButtonTitles:NSLocalizedString(@"OK", @""), nil]; query.alertViewStyle = UIAlertViewStylePlainTextInput; UITextField *textField = [_query textFieldAtIndex:0]; textField.placeholder = NSLocalizedString(@"Title", @"placeholder text where user enters name for new playlist"); textField.delegate = self; [_query show]; } 

显示UIAlertView后,键盘也显示, UITextfield是焦点(它只适用于iOS7,但不适用于iOS8)。 我试过[textfield becomeFirstResponder] ,但它不起作用。 我创build新的项目,并使用上面的海湾,它的作品。

我的问题:键盘不显示与UIAlertViewStylePlainTextInput样式。

我不知道为什么? 任何人都可以帮助我吗? 谢谢。

这个丑陋的黑客为我打电话后显示:

 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // HACKHACK: This is to make the keyboard appear in iOS8 UITextRange* textRange = self.textField.selectedTextRange; [self.textField selectAll:self]; [UIMenuController sharedMenuController].menuVisible = NO; self.textField.selectedTextRange = textRange; }); 

进入同样的问题,并花了几个小时摆弄UIAlertController,这是“正确的”解决scheme,但不幸的是有其他地方的几个问题(例如,它从一个popover呈现时中断),并将不适用于iOS7。

这绝对是iOS8中的一个错误。 我希望苹果很快就能解决这个问题。 不幸的是,与iOS7编译的较旧的二进制文件不符。

这是陈林的黑客/修复,将放在UIAlertViewDelegate略有改善:

 - (void)didPresentAlertView:(UIAlertView *)alertView { if (isIOS8) { // hack alert: fix bug in iOS 8 that prevents text field from appearing UITextRange *textRange = [[alertView textFieldAtIndex:0] selectedTextRange]; [[alertView textFieldAtIndex:0] selectAll:nil]; [[alertView textFieldAtIndex:0] setSelectedTextRange:textRange]; } } 

(您必须实施isIOS8方法,属性或iVar。)

这有助于我解决所有相关的问题:

 [MyUITextView endEditing:YES]; 

把它放在显示UIAlertView之前。

在我这种情况下,这是因为UIViewController呈现UIAlertView实施了canBecomeFirstResponder与YES结果,因为我想听“摇”事件。

一旦我添加了UIAlertViewDelegate方法的以下实现,键盘就按预期呈现:

 - (void)willPresentAlertView:(UIAlertView *)alertView { [self resignFirstResponder]; } 

所以这可能无法解决所谓的“弃用”类的所有问题,但它是检查你的控制器是否启用第一响应者行为的东西。

对于我来说,问题是文本字段已经有了第一个响应者状态,所以当警告代码被调用时,键盘已经可见了。 解雇这个领域解决了这个问题。

你看到这个在设备上,或者只是在SIM卡?

iOS8的SIM卡似乎有一个问题,它检测到一个物理键盘,并没有显示软件键盘。 可能是故意的,因为你在技术上使用物理键盘……这不是模拟testing的理想行为。

如果这是您的问题,请尝试使用命令K切换SIM卡中的软件键盘。

我遇到了同样的情况,我如何解决这个错误是试图在显示alertView之前退出当前的响应者。而UITextField的键盘popup如预期的那样。

 UITextField *textField = ...; // Suppose textField is currently being edited. [textField resignFirstResponder]; // before showing,resign first. [_query show]; 

UIAlertView文档的第一页指出:

子类化注意事项 UIAlertView类旨在按原样使用,不支持子类化。 这个类的视图层次是私有的,不能被修改。

有关外观和行为configuration的更多信息,请参阅“警报视图”。

换句话说,你不应该混淆UIAlertView窗口的内容。 事实上,它在早期的操作系统版本比iOS 8实际工作只是一个奖金。 从iOS 8开始不推荐使用。

你想在iOS 8中做什么是使用全新的UIAlertController类 ,它允许可编辑的文本字段。