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
相关产品推荐
相关产品推荐

