SwiftUI iOS15 下TextField的keyboard toolbar不显示问题咨询
问题原因说明
- 这是iOS 15.0 ~ 15.2 搭配 Xcode 13.0 ~ 13.2 beta 版本的SwiftUI已知实现缺陷,当
TextField处于ScrollView(以及基于ScrollView封装的List、Form等容器)内部时,绑定在TextField上的toolbar修饰符配置会被ScrollView的内部视图上下文拦截,系统无法将该键盘工具栏配置正确关联到第一响应者的键盘显示逻辑中,最终导致工具栏不展示。 - iOS 15 早期版本的键盘工具栏配置存在作用域限制:
placement: .keyboard类型的toolbar修饰符要求必须挂载到当前视图层级的顶层容器(如外层的VStack、NavigationStack),如果直接挂载到ScrollView的子视图上,子视图的修饰符作用域会被ScrollView的响应链层级覆盖,导致配置失效。
临时解决方案
- 将
toolbar修饰符从TextField上移除,挂载到包含ScrollView的外层父容器上,即可正常触发键盘工具栏显示,示例代码如下:
struct ContentView: View { @State private var text = "" var body: some View { NavigationStack { // 或外层的VStack等容器 ScrollView { TextField("placeholder", text: $text) } .toolbar { ToolbarItemGroup(placement: .keyboard) { Button("Done") { hideKeyboard() } } } } } } // hideKeyboard通用实现参考 extension View { func hideKeyboard() { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } }
- 升级运行环境到iOS 15.4+、Xcode 13.3正式版及以上,该版本已经修复了这个问题,原有写法可正常生效。
内容的提问来源于stack exchange,提问作者Kevin Vu
相关产品推荐
相关产品推荐

