iOS页面多个UITextField交互时点击自定义视图输入框无法隐藏系统键盘
iOS UIScrollView嵌套Nib视图下TextField切换时系统键盘无法隐藏问题解决
问题场景
页面结构为UIScrollView嵌套自定义Nib内容视图,Nib视图内包含3个UITextField,不同输入框的编辑触发逻辑如下:
- 第一个输入框编辑开始时展示自定义选择视图
- 第二个输入框编辑开始时呼出系统键盘
- 第三个输入框编辑开始时展示自定义选择视图
复现步骤
- 先点击第二个输入框呼出系统键盘
- 再点击第一个输入框,此时系统键盘无法正常隐藏
现有实现代码
kehuiInfoView.dateInput.rx.controlEvent(.editingDidBegin) .subscribe { _ in weakSelf?.view.endEditing(true) weakSelf?.kehuiInfoView.dateInput.resignFirstResponder() weakSelf?.datePicker.show() } .disposed(by: bag)
问题根因
UITextField的editingDidBegin事件触发时,系统键盘的弹出逻辑已经进入响应链执行队列,此时调用endEditing和resignFirstResponder的优先级低于已经入队的键盘弹出指令,导致键盘先弹出再尝试隐藏失效,同时UIScrollView的默认键盘适配逻辑也会干扰第一响应者的状态判断。
解决方案
方案1:异步执行隐藏逻辑
将隐藏键盘和释放第一响应者的操作放到主队列异步执行,插队到当前响应链事件之后执行即可生效:
kehuiInfoView.dateInput.rx.controlEvent(.editingDidBegin) .subscribe { _ in DispatchQueue.main.async { weakSelf?.view.endEditing(true) weakSelf?.kehuiInfoView.dateInput.resignFirstResponder() weakSelf?.datePicker.show() } } .disposed(by: bag)
方案2:直接设置空输入视图(更推荐)
初始化阶段直接给不需要系统键盘的输入框设置空的inputView,从根源阻断系统键盘弹出逻辑,不需要额外处理第一响应者释放:
// 初始化时配置不需要系统键盘的输入框 kehuiInfoView.dateInput.inputView = UIView() kehuiInfoView.dateInput.rx.controlEvent(.editingDidBegin) .subscribe { _ in weakSelf?.datePicker.show() } .disposed(by: bag)
内容的提问来源于stack exchange,提问作者Latte_Bear
相关产品推荐
相关产品推荐

