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类 ,它允许可编辑的文本字段。