I have implemented a SwiftUI view containing a grid of TextField elements, where focus moves automatically to the next field upon input. This behavior works well on iOS 16 and 17, maintaining proper focus highlighting when keyboard full access is enabled.
However, in iOS 18 and above, the keyboard full access focus behaves differently. It always stays behind the actual focus state, causing a mismatch between the visually highlighted field and the active text input. This leads to usability issues, especially for users navigating with an external keyboard.
Below is the SwiftUI code for reference:
struct AutoFocusGridTextFieldsView: View {
    private let fieldCount: Int
    private let columns: Int
    @State private var textFields: [String]
    @FocusState private var focusedField: Int?
    init(fieldCount: Int = 17, columns: Int = 5) {
        self.fieldCount = fieldCount
        self.columns = columns
        _textFields = State(initialValue: Array(repeating: "", count: fieldCount))
    }
    var body: some View {
        let rows = (fieldCount / columns) + (fieldCount % columns == 0 ? 0 : 1)
        VStack(spacing: 10) {
            ForEach(0..<rows, id: \.self) { row in
                HStack(spacing: 10) {
                    ForEach(0..<columns, id: \.self) { col in
                        let index = row * columns + col
                        if index < fieldCount {
                            TextField("", text: $textFields[index])
                                .frame(width: 40, height: 40)
                                .multilineTextAlignment(.center)
                                .textFieldStyle(RoundedBorderTextFieldStyle())
                                .focused($focusedField, equals: index)
                                .onChange(of: textFields[index]) { newValue in
                                    if newValue.count > 1 {
                                        textFields[index] = String(newValue.prefix(1))
                                    }
                                    if !textFields[index].isEmpty {
                                        moveToNextField(from: index)
                                    }
                                }
                        }
                    }
                }
            }
        }
        .padding()
        .onAppear {
            focusedField = 0
        }
    }
    private func moveToNextField(from index: Int) {
        if index + 1 < fieldCount {
            focusedField = index + 1
        }
    }
}
struct AutoFocusGridTextFieldsView_Previews: PreviewProvider {
    static var previews: some View {
        AutoFocusGridTextFieldsView(fieldCount: 10, columns: 5)
    }
}
Has anyone else encountered this issue with FocusState in iOS 18?
I really do believe that this is a bug strictly connected to keyboard navigation since I experienced similar problem also on UIKit equivalent of the view.
Any insights or suggestions would be greatly appreciated!