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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:24:57