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

时间:2014-08-29 06:58:12

标签: ios

@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],但它没有用。我创建新项目并使用上面的海湾,它可以工作。

我的问题:键盘没有以UIAlertViewStylePlainTextInput样式显示。

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

7 个答案:

答案 0 :(得分:18)

这里对陈琳的黑客/修复有一点改进,放在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。)

答案 1 :(得分:10)

这个丑陋的黑客在打电话给我之后为我工作了:

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,这是一个“正确的”解决方案,但遗憾的是在其他地方有一些问题(例如,当从弹出窗口呈现时它会中断),并且不适用于iOS7。 / p>

这绝对是iOS8中的一个错误。我希望Apple尽快解决这个问题。不幸的是,即使使用为iOS7编译的旧二进制文件也能打破它。

答案 2 :(得分:3)

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

[MyUITextView endEditing:YES];

在显示UIAlertView之前放置。

答案 3 :(得分:2)

在我的情况下,这种情况正在发生,因为UIViewController提出的UIAlertView已经实施了canBecomeFirstResponder并且结果为是,因为我想要倾听'摇晃'事件

我添加了UIAlertViewDelegate方法的以下实现后,键盘按预期显示:

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

所以这可能无法解决这个所谓的“被弃用的”问题。但是要检查控制器是否启用了第一响应者行为。

答案 4 :(得分:0)

对我来说,问题是文本字段已经具有第一响应者状态,因此在调用警报代码时键盘已经可见。解雇此字段可解决问题。

答案 5 :(得分:0)

你是在设备上看到这个,还是只是在sim?

iOS8 sim卡似乎存在问题,它检测到物理键盘,并且不显示软件键盘。可能是故意的,因为你在技术上使用的是物理键盘......这不是sim测试的理想行为。

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

答案 6 :(得分:-2)

The first page of the UIAlertView documentation州:

  

子类注释   UIAlertView类旨在按原样使用,不支持子类化。此视图层次结构   class是私有的,不得修改。

     

有关外观和行为配置的详细信息,请参阅   “警示意见”。

换句话说,你不应该搞乱UIAlertView窗口的内容。它实际上在iOS 8之前的OS版本中工作的事实只是一个奖励。从iOS 8开始,它已被弃用。

在iOS 8中您要做的是使用brand new UIAlertController class,它允许使用可编辑的文本字段。