在 iOS8.3 上显示警报视图时,iOS 键盘通知不必要地触发

Posted

技术标签:

【中文标题】在 iOS8.3 上显示警报视图时,iOS 键盘通知不必要地触发【英文标题】:iOS Keyboard notifications triggered unnecessarily upon showing the alertviews on iOS8.3 【发布时间】:2015-05-20 04:53:21 【问题描述】:

我们在 ios 8.3 上观察到关于键盘将显示和隐藏通知的异常行为。

viewcontroler(监听键盘通知)有一个文本文件,点击提交按钮后,该方法首先从文本字段中退出第一响应者,并显示警报以通知警告。一切正常,它会关闭键盘并按预期显示警报。 (也调用 UIKeyboardWillHideNotification 方法)。

但是,在 8.3 上,在 Alertview 委托上点击 OK/Cancel 后,它会关闭警报并分别调用 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification,尽管它不应该被调用!这是意料之外的,因为在显示警报之前键盘已经关闭!

这是我们正在尝试的代码 sn-p:

- (void)viewDidLoad 

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

    

- (IBAction)ShowAlert:(id)sender 

    [self.TxtField resignFirstResponder];

     //This woudln't make any diff either :(
    [self.view endEditing:YES];

          [self ShowAlertForTest];




-(void)ShowAlertForTest

    UIAlertView *theAlertView= [[UIAlertView alloc]initWithTitle:@"Title"

                                                         message:@"msg"

                                                        delegate:self

                                               cancelButtonTitle:@"Cancel"

                                               otherButtonTitles:@"Yes", nil];

   [theAlertView show];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

     NSLog(@"buttonIndex = %ld",buttonIndex);


- (void)keyboardWillShow:(NSNotification *)aNotification

    NSLog(@"keyboardWillShow");



- (void)keyboardWillHide:(NSNotification *)aNotification

    NSLog(@"keyboardWillHide");

这种行为会导致我们的应用出现问题,当之前的 alertview 的委托触发了级联警报时 - 在不需要的情况下调出键盘。

非常感谢任何帮助/建议!

【问题讨论】:

是否需要支持低于8的版本?否则, UIAlertView 将被弃用,您可能会通过UIAlertController获得更多成功 是的@Yaser,我们也支持iOS7! 【参考方案1】:

在我们的例子中,键盘是由应用手动隐藏的(例如,当用户点击登录时,我们隐藏键盘并调用服务器登录 API)。失败后,应用程序会向UIAlertView 显示错误消息。当用户关闭警报时,iOS 帖子将/确实隐藏并且将/确实显示通知。当然,键盘在此序列中不会显示和隐藏,因为它已经被应用程序隐藏了。

但是,我们注意到不是手动隐藏键盘,而是让 iOS 为我们做这件事,解决了这个问题。所以,键盘在两种情况下会自动隐藏:

    UIAlertView 显示时 当视图控制器被释放时

注意:UIAlertView 被关闭时,键盘会自动显示。

【讨论】:

【参考方案2】:

我的团队通过在显示警报视图之前取消订阅键盘通知并在解除警报视图后重新订阅这些通知来解决问题。不理想,但它为我们解决了问题。

【讨论】:

【参考方案3】:

在我的例子中,用户点击登录按钮,然后我调用;

[self.view endEditing: YES];
//server request here and in completion/fail alert.

键盘已关闭,alertview 很好地显示,但在取消/应用单击时,键盘再次显示并消失了。但问题是有时会发生这种情况,如果服务器请求需要时间问题,则不会出现问题,如果 Alertview 立即显示问题还在那里。所以我决定延迟通知我的警报。延迟警报解决了我的问题。希望这会有所帮助。

【讨论】:

【参考方案4】:

我刚刚修复了一个类似的问题。警报消失后键盘一直弹出这似乎是苹果的一个错误。 我建议您使用 UIAlertController 而不是 UIAlertView。它将避免很多潜在的问题 有一个简单的解决方案:如果你使用 UIAlertController,你可以将动画设置为 NO

[self presentViewController:alert animated:NO completion:nil];

如果它解决了您的问题,请告诉我

【讨论】:

以上是关于在 iOS8.3 上显示警报视图时,iOS 键盘通知不必要地触发的主要内容,如果未能解决你的问题,请参考以下文章

如何获得 iOS 8.3 表情符号键盘高度?

在IOS中显示警报时,键盘不会从View中退出

如何防止键盘出现在自定义警报视图上

警报视图中的文本字段未在 iOS 7 上显示 [关闭]

如何在 iOS 中触发通知时打开警报视图?

带有附件视图的 iOS 8 自调整单元格