SwiftUI TextField键盘工具栏Done按钮无法显示问题求助
解决SwiftUI TextField键盘工具栏Done按钮不显示的问题
以下是几个排查和解决的方向:
确保视图在Navigation容器内
SwiftUI的toolbar依赖Navigation环境提供的上下文,如果你的TextField没有被NavigationStack(iOS 16+)或NavigationView(iOS 15及更早版本)包裹,键盘工具栏将无法渲染。把TextField所在的整个视图层级放入Navigation容器即可:NavigationStack { // 你的TextField及相关视图代码 }验证焦点绑定的正确性
检查isTextEditorFocused变量的定义:如果是视图内的状态,需要用@State修饰;如果来自ViewModel,需要是@Published属性。确保文本框获取焦点时该状态能正确变为true,失去焦点时变为false——toolbar的显示和文本框的焦点状态直接相关。检查TextField的禁用状态
当viewModel.isEditEnabled为false时,TextField会被禁用,此时无法唤起键盘,自然看不到工具栏。测试时先确保isEditEnabled为true,让TextField处于可编辑状态。尝试调整Toolbar的放置位置
个别场景下.keyboard放置位置可能存在兼容性问题,可以尝试替换为.bottomBar(用于测试toolbar是否能正常渲染),或者检查页面内是否有其他toolbar元素导致冲突。
修改后的示例代码
@State private var isTextEditorFocused = false var body: some View { NavigationStack { TextField(text: $viewModel.assignee, prompt: Text(" Assignee"), label: {}) .autocorrectionDisabled(true) .textInputAutocapitalization(.never) .focused($isTextEditorFocused) .toolbar(content: { ToolbarItemGroup(placement: .keyboard) { Spacer() Button("Done") { isTextEditorFocused = false } } }) .font(.custom("ProximaNova-Regular", size: 16)) .frame(height: 30) .frame(maxWidth: .infinity) .overlay(content: { RoundedRectangle(cornerRadius: 4) .stroke(Color.gray , lineWidth: 0.5) }) .padding(.bottom, 10) .padding(.horizontal , 10) .disabled(!viewModel.isEditEnabled) } }
内容的提问来源于stack exchange,提问作者Luke_hog
相关产品推荐
相关产品推荐

