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

如果在关闭键盘同时弹出UIAlertView,会导致当UIAlertView被dismiss时,出现键盘闪动一次(弹出又关闭)。
【解决UIAlertView导致键盘弹出的问题】做某需求时被这个问题困扰好几天,在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]; }

    推荐阅读