自定义带UITextField的inputAccessoryView:canBecomeFirstResponder作用疑问
关于inputAccessoryView必须设置canBecomeFirstResponder为true才显示的问题解答
嘿,这个问题我做聊天类APP时也踩过坑,其实是UIKit的底层设计逻辑在起作用~
核心原因
UIKit的inputAccessoryView是和第一响应者(First Responder)绑定的辅助视图:系统只会给当前处于活跃状态的第一响应者展示它的inputAccessoryView。如果你的视图控制器没有开启canBecomeFirstResponder = true,它就没办法成为第一响应者,系统找不到可以挂载这个辅助视图的“宿主”,自然就会把它隐藏起来。
结合你的代码修正
你已经重写了inputAccessoryView属性,只需要补全canBecomeFirstResponder的实现,再主动让视图控制器成为第一响应者就行:
- 修正
canBecomeFirstResponder的getter方法:
override var canBecomeFirstResponder: Bool { return true // 直接返回true,允许视图控制器成为第一响应者 }
- 在
viewDidLoad里主动触发成为第一响应者,确保视图加载后输入栏就显示:
override func viewDidLoad(){ super.viewDidLoad() self.becomeFirstResponder() // 主动成为第一响应者,唤起inputAccessoryView }
额外说明
如果你的inputTextFieldContainer里包含UITextField,当用户点击文本框时,文本框会成为新的第一响应者,但这时候你的inputAccessoryView不会消失——因为它属于视图控制器,系统会自动保持它的显示状态,正好符合聊天APP输入栏固定在底部的需求。
内容的提问来源于stack exchange,提问作者PrepareFor
相关产品推荐
相关产品推荐

