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

自定义带UITextField的inputAccessoryView:canBecomeFirstResponder作用疑问

关于inputAccessoryView必须设置canBecomeFirstResponder为true才显示的问题解答

嘿,这个问题我做聊天类APP时也踩过坑,其实是UIKit的底层设计逻辑在起作用~

核心原因

UIKit的inputAccessoryView是和第一响应者(First Responder)绑定的辅助视图:系统只会给当前处于活跃状态的第一响应者展示它的inputAccessoryView。如果你的视图控制器没有开启canBecomeFirstResponder = true,它就没办法成为第一响应者,系统找不到可以挂载这个辅助视图的“宿主”,自然就会把它隐藏起来。

结合你的代码修正

你已经重写了inputAccessoryView属性,只需要补全canBecomeFirstResponder的实现,再主动让视图控制器成为第一响应者就行:

  1. 修正canBecomeFirstResponder的getter方法:
override var canBecomeFirstResponder: Bool {
    return true // 直接返回true,允许视图控制器成为第一响应者
}
  1. 在viewDidLoad里主动触发成为第一响应者,确保视图加载后输入栏就显示:
override func viewDidLoad(){
    super.viewDidLoad()
    self.becomeFirstResponder() // 主动成为第一响应者,唤起inputAccessoryView
}

额外说明

如果你的inputTextFieldContainer里包含UITextField,当用户点击文本框时,文本框会成为新的第一响应者,但这时候你的inputAccessoryView不会消失——因为它属于视图控制器,系统会自动保持它的显示状态,正好符合聊天APP输入栏固定在底部的需求。

内容的提问来源于stack exchange,提问作者PrepareFor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:22:53