Home > Software design >  iOS 16 SwiftUI TextField in section header (List)
iOS 16 SwiftUI TextField in section header (List)

Time:11-29

If run this code on iOS16 keyboard gets dismissed randomly when character is typed (please see gif), while on iOS15 everything is fine.

struct ContentView: View {
    
    let names = ["Holly", "Josh", "Rhonda", "Ted"]
    @State var text = ""

    var body: some View {
        List {
            Section {
                ForEach(searchResults, id: \.self) { name in
                    Text(name)
                }
            } header: {
                TextField("Search for name", text: $text)
            }
        }
     
    }
    
    var searchResults: [String] {
        if text.isEmpty {
            return names
        } else {
            return names.filter { $0.contains(text) }
        }
    }
}

It happens when content is in a section with a header. Is it bug from apple introduced in iOS16 or am I doing something wrong? Has anyone had the same issue?

enter image description here

CodePudding user response:

It might have something to do with the way List works. I experimented a bit and if you add .searchable to the Section instead of the List, I am not able to reproduce the problem.

struct ContentView: View {

    let names = ["Holly", "Josh", "Rhonda", "Ted"]
    @State var text = ""

    var body: some View {
        List {
            Section {
                ForEach(searchResults, id: \.self) { name in
                    Text(name)
                }
            } header: {
                TextField("Search for name", text: $text)
            }.searchable(text: $text) // <- Here
        }
    }

    var searchResults: [String] {
        if text.isEmpty {
            return names
        } else {
            return names.filter { $0.contains(text) }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

CodePudding user response:

Searchable adds it's own textfield, you shouldn't add another one, especially not one in a section that is being removed/added.

  • Related