iOS中点击UIAlertView按钮后TextField键盘弹出延迟问题求助
解决UIAlertController关闭后TextField键盘弹出延迟的问题
这个延迟问题我之前开发iOS App时也碰到过!本质原因是UIAlertController的消失动画和键盘弹出动画抢了系统的动画资源,导致键盘弹出被拖慢了。
你当前的代码里,点击alert的"Okay"按钮后立刻调用self.TextField.becomeFirstResponder(),但此时alert还在执行消失的动画(哪怕是cancel按钮,系统也会有默认的淡出动画),两个动画同时触发就会造成冲突,键盘弹出就会有明显的延迟。
解决方案:等Alert动画完全结束后再唤起键盘
最简单有效的方法是给becomeFirstResponder()加一个极短的延迟,刚好等alert的消失动画完成。修改你的handler代码如下:
if TextField.text?.isEmpty ?? true { let alert = UIAlertController(title: "Title", message: "Text", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Okay", style: .cancel, handler: { (action: UIAlertAction!) in // 延迟0.2秒,刚好匹配alert消失的动画时长 DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { self.TextField.becomeFirstResponder() } })) self.present(alert, animated: true) print("textField is empty") } else { // 你的其他逻辑 }
更优雅的实现(监听动画完成)
如果你不想用固定延迟,也可以通过CATransaction监听alert消失的动画完成事件,这样更精准:
alert.addAction(UIAlertAction(title: "Okay", style: .cancel, handler: { (action: UIAlertAction!) in CATransaction.begin() CATransaction.setCompletionBlock { self.TextField.becomeFirstResponder() } // 系统会自动dismiss alert,这里的CATransaction会捕获这个动画的完成事件 CATransaction.commit() }))
额外检查点
如果修改后还是有延迟,可以确认一下:
- TextField的
isEnabled和isUserInteractionEnabled是否都设为true - 当前页面有没有其他正在执行的动画或耗时操作
内容的提问来源于stack exchange,提问作者user6023982
相关产品推荐
相关产品推荐

