在显示alertview或alertcontroller时,键盘将自动出现在ios 8.3中

时间:2015-05-28 06:39:28

标签: uialertview ios8.3

我已更新Xcode 6.3和ios8.3检查我的代码。然后它给了我奇怪的结果。

这是我的演示应用的第一个屏幕。这是一个文本域。当我在textfield键盘打开时输入somethin。

enter image description here

输入完成后

。我点击了显示提醒按钮。我已经显示警报,输出将会跟随。

enter image description here

点击取消后。 我已经显示了另一个警报然后奇怪的结果键盘不应该打开但是当点击取消按钮时。显示另一个警报,键盘将自动出现。

这是下一个屏幕输出

enter image description here

以下是代码

- (IBAction)MethodShowAlert:(id)sender 
 {

[tmptxtField resignFirstResponder];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Check Alert textField" message:@"keyboard should not be open" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:nil];
[alert show];
 }

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
  {
    [self showCustomAlertWithTitle:nil];
  }


-(void)showCustomAlertWithTitle:(NSString *)title{
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Now Check" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil];

      [alertView show]
  }

5 个答案:

答案 0 :(得分:19)

在我的情况下,我试图隐藏键盘,然后显示警告,所以它不会将键盘保存在内存中,以便在解除它后再次显示它。

为此您只需要关闭键盘,这将隐藏默认动画时间,然后您应该出现警报视图,然后它将不会保存该键盘。

你必须在隐藏键盘和提示警告

时留出大约0.6秒的差距
  [YOUR_TEXT resignFirstResponder];
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{


                    _alertVw = [[UIAlertView alloc] initWithTitle:@"" message:@"message." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];

                    [_alertVw show];
});

答案 1 :(得分:15)

是的,这很奇怪。

但是从iOS 8开始,我建议使用UIAlertController而不是UIAlertView。

用以下代码替换您的代码:

- (IBAction)MethodShowAlert:(id)sender
{

    [tmptxtField resignFirstResponder];

    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"Check Alert textField"
                                                                              message:@"keyboard should not be open"
                                                                       preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"Cancel"
                                                            style:UIAlertActionStyleDefault
                                                          handler:^(UIAlertAction *action) {
                                                              [self showCustomAlertWithTitle:@"Now Check"];
                                                          }];

    [alertController addAction:cancelAction];

    [self presentViewController:alertController animated:YES completion:nil];
}


-(void)showCustomAlertWithTitle:(NSString *)title{

    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:title
                                                                              message:nil
                                                                       preferredStyle:UIAlertControllerStyleAlert];

    [self presentViewController:alertController animated:YES completion:nil];
}

点击按钮后键盘不会显示。

答案 2 :(得分:7)

这是iOS 8.3中引入的行为更改。尝试下载iOS 8.2模拟器,您将看到旧的行为。

我的分析结果如下:

  1. 当显示警告时,它会保存当前显示的键盘。
  2. 当警报完成关闭动画时,它会恢复以前保存的键盘。
  3. 所以在-[id<UIAlertViewDelegate> alertView:clickedButtonAtIndex:]中,你处于这些状态之间。那么同时显示的两个警报会发生什么:

    1. 显示Alert1。保存可见键盘。隐藏键盘。
    2. 用户点击提醒。
    3. 显示Alert2。保存没有键盘。
    4. Alert1完成解除动画。恢复保存的键盘。键盘可见。
    5. 用户点击提醒。
    6. Alert2被驳回。恢复没有键盘。隐藏键盘。
    7. 我的建议是使用在解雇动画完成后调用的UIAlertViewDelegate方法,然后显示下一个警告。

答案 3 :(得分:0)

从以下方法替换警报方法。

UIAlertController * alertVC = [UIAlertController alertControllerWithTitle:messege title message:message preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *cancelAction = [UIAlertAction
                               actionWithTitle:@"OK"
                               style:UIAlertActionStyleCancel
                               handler:^(UIAlertAction *action)
                               {

                               }];
[alertVC addAction:cancelAction];

[[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{

}];

答案 4 :(得分:0)

我还尝试了在显示警报之前直接隐藏键盘。

对我有用的是呼叫[myTextField endEditing:YES];而不是[myTextField resignFirstReponder];

这使键盘保持隐藏状态,即使再次关闭警报也是如此。

代码如下:

[myTextField endEditing:YES];

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"myTitle"
                                                                             message:nil
                                                                      preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"NO"
                                                           style:UIAlertActionStyleCancel
                                                         handler:nil];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"YES"
                                                       style:UIAlertActionStyleDefault
                                                     handler:nil];
[alertController addAction:cancelAction];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];