IOS 8 无法从 UITextField 关闭键盘

IOS 8 can't dismiss keyboard from UITextField

我认为我的问题类似于:iOS 8 Keyboard Dismissed delay after modal view controller is dismissed 但我不清楚其他线程如何在我的应用程序中解决它。

在 Xcode5/IOS7 中,我展示了一个带有 2 个 UITextField 的 UIAlertView。用户可以简单地按 OK 并继续,或者他们可以在文本字段中输入密码/确认密码。在 IOS7 中,我在显示 alertview 时隐藏了键盘,键盘会自动重新出现 if/when 用户点击文本字段:

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 的键盘 直到 用户实际上通过点击文本字段?

谢谢!

由于它在 iOS 7 中有效并且您已经在这上面花费了一段时间,我将只实现类似问题中的第二个代码块的东西 here 从 if [uialertcontroller class]

开始

我遇到了同样的问题,试图隐藏 modal 弹出窗口 window 中的键盘。 resignFirstResponder什么都不做。

解决方案...是 禁用 对话框中的所有 UITextFields 控件(因此 iOS 无法锁定任何需要键盘),然后在几分之一秒后重新启用相关的键盘。

这很烦人,但它确实有效...

(叹气。)

我不确定是否有人像我一样对 iOS9 有同样的问题,但我设法通过这种方式让它工作:

  1. 尝试将注意力集中在其中一个文本字段上

    [self.someTextfield becomeFirstResponder];
    
  2. 那就延迟吧,然后移走焦点

    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];  
    });