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

SwiftUI中TextField触发onCommit后如何保持光标停留在当前输入框

SwiftUI TextField点击Return后保持焦点解决方案

这个需求完全可以实现,核心是控制TextField的焦点状态,以下是适配不同系统版本的实现方式:

iOS 15及以上版本(推荐方案)

通过SwiftUI原生的@FocusState属性包装器控制焦点即可,原有onCommit逻辑不需要调整,只需要增加3处修改:

  • 给RowView新增@FocusState私有属性,记录当前输入框的焦点状态
  • 给TextField添加focused修饰符,和上述属性绑定
  • 在onCommit逻辑执行完成后,主动将焦点状态置为true

修改后的完整代码:

struct RowView: View {
    @Binding var checklistItem: ChecklistItem
    @ObservedObject var checklist = Checklist()
    @ObservedObject var viewModel: ChecklistViewModel
    // 新增:焦点状态控制
    @FocusState private var isInputActive: Bool
    
    var body: some View {
        HStack {
            Button {
                self.checklistItem.isChecked.toggle()
                self.viewModel.updateChecklist(checklistItem)
            } label: {
                Circle()
                    .strokeBorder(checklistItem.isChecked ? checklistSelected : contentPrimary, lineWidth: checklistItem.isChecked ? 6 : 2)
                    .foregroundColor(backgroundSecondary)
                    .clipShape(Circle())
                    .frame(width: 16, height: 16)
            }.buttonStyle(BorderlessButtonStyle())
            // swiftlint:disable trailing_closure
            TextField(
                "Add...",
                text: $checklistItem.name,
                onCommit: {
                    do {
                        if !checklistItem.name.isEmpty {
                            self.viewModel.updateChecklist(checklistItem)
                            // 原有赋值逻辑不需要改
                            self.checklistItem.name = checklistItem.name
                        }
                        // 新增:提交后主动保持焦点
                        isInputActive = true
                    }
                }
            )
            // swiftlint:enable trailing_closure
            // 新增:绑定焦点状态
            .focused($isInputActive)
            .foregroundColor(checklistItem.isChecked ? contentTertiary : contentPrimary)
            Spacer()
        }
    }
}

iOS 13/14兼容方案

如果需要支持旧版本系统,需要用UIKit桥接实现:

  • 用UIViewRepresentable包装UITextField
  • 实现textFieldShouldReturn代理方法,执行提交逻辑后返回false,即可阻止输入框失去焦点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:03:02