SwiftUI:提交后留在同一个 TextField 上?

Hus*_*iry 3 textfield swiftui

即使用户点击键盘上的 Return 键,SwiftUI 中是否也可以将输入光标保持在同一个文本字段上?

这是我的代码:

struct RowView: View {
    @Binding var checklistItem: ChecklistItem
    @ObservedObject var checklist = Checklist()
    @ObservedObject var viewModel: ChecklistViewModel
    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
                        }
                    }
                }
            )
            // swiftlint:enable trailing_closure
            .foregroundColor(checklistItem.isChecked ? contentTertiary : contentPrimary)
            Spacer()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在用户点击键盘上的返回键后, TextField() onCommit 应正常激活,但光标停留在同一文本字段中,以便用户可以继续输入新元素。

Geo*_*e_E 5

iOS 15+

您可以使用@FocusStateand 在提交时立即将TextField重新设置为获得焦点。

例子:

struct ContentView: View {
    @State private var text = "Hello world!"
    @FocusState private var isFieldFocused: Bool

    var body: some View {
        Form {
            TextField("Field", text: $text, onCommit: {
                isFieldFocused = true
                print("onCommit")
            })
            .focused($isFieldFocused)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

结果