SwiftUI @FocusState doesn’t focus a desired TextField
I have a SwiftUI view with multiple TextFields and a @FocusState bound to my view model. I want the first field to automatically get focus whenever the view appears. Here’s a minimal example:
import SwiftUI
struct MyView: View {
@StateObject private var viewModel: MyViewModel
@FocusState private var activeField: MyViewModel.Field?
init(viewModel: MyViewModel) {
self._viewModel = StateObject(wrappedValue: viewModel)
}
var body: some View {
VStack(spacing: 20) {
TextField("Field 1", text: $viewModel.field1)
.focused($activeField, equals: .field1)
.textFieldStyle(.roundedBorder)
TextField("Field 2", text: $viewModel.field2)
.focused($activeField, equals: .field2)
.textFieldStyle(.roundedBorder)
TextField("Field 3", text: $viewModel.field3)
.focused($activeField, equals: .field3)
.textFieldStyle(.roundedBorder)
}
.padding()
.onAppear {
// Attempt to focus the first field
viewModel.focusedField = .field1
activeField = viewModel.focusedField
}
.onChange(of: activeField) { _, newValue in
viewModel.focusedField = newValue
}
.onChange(of: viewModel.focusedField) { _, newValue in
activeField = newValue
}
}
}
What am I doing wrong?