解决UIAlertView导致键盘弹出的问题

如果在关闭键盘同时弹出UIAlertView,会导致当UIAlertView被dismiss时,出现键盘闪动一次(弹出又关闭)。

做某需求时被这个问题困扰好几天,在stackoverflow上查询无果;各种google网络寻找前人经验,只有人说用dispatch_after做少量延时后再弹出alertView,像下面这样。但是经过测试效果不好,而且延时多少不好把握,容易出现UI不连贯。

解法一:

dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC));
dispatch_after(delay, dispatch_get_main_queue(), ^{
      [alertView show];
 });

解法二:

如果用UIAlertController代替UIAlertView,就不会有任何UI问题。但是UIAlertController必须要通过某个VC进行present操作,在别的模块需要弹框时,只能全局查询顶层VC,比较麻烦,没有UIAlertView用起来方便。

终极解法:

最后发现原因是键盘关闭动画被打断后,UIAlertView所在window被系统设置成editing状态。通过以下方式可完美解决,实现UIAlertViewDelegate的方法。

#pragma mark - UIAlertViewDelegate

- (void)didPresentAlertView:(UIAlertView *)alertView {
    // Fix bug: show keyboard then dismiss after we have dismissed some alertview
    [alertView.window endEditing:YES];
}

你可能感兴趣的:(解决UIAlertView导致键盘弹出的问题)