You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS页面多个UITextField交互时点击自定义视图输入框无法隐藏系统键盘

iOS UIScrollView嵌套Nib视图下TextField切换时系统键盘无法隐藏问题解决

问题场景

页面结构为UIScrollView嵌套自定义Nib内容视图,Nib视图内包含3个UITextField,不同输入框的编辑触发逻辑如下:

  • 第一个输入框编辑开始时展示自定义选择视图
  • 第二个输入框编辑开始时呼出系统键盘
  • 第三个输入框编辑开始时展示自定义选择视图

复现步骤

  1. 先点击第二个输入框呼出系统键盘
  2. 再点击第一个输入框,此时系统键盘无法正常隐藏

现有实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:09:02