Swift 在List中当ForEach添加行时TextField失去焦点
问题描述
我在这里阅读了许多类似的问题,关于使用ForEach导致TextField失去焦点,但是所有这些问题都基于ForEach使用绑定参数。这个问题不是这样的。
我有一个List,第一行是一个TextField,然后是一个ForEach,根据TextField中的文本来显示匹配项目的行。这是代码:
struct ContentView: View {
@State private var textValue = ""
var body: some View {
List {
// Text Entry
TextField("Person:", text: textValue)
// Suggestions
ForEach(suggestions, id: \.id) { onePerson in
Text(onePerson.id)
}
}
}
var suggestions: [PersonSuggestion] {
guard !textValue.isEmpty else { return [] }
let existingPeople = Person.allCases
.filter {0.rawValue.localizedCaseInsensitiveContains(textValue) }
.sorted(using: KeyPathComparator(\.rawValue))
.map { PersonSuggestion.existing(person: $0) }
if textValue != existingPeople.first?.id {
return [.new(name: textValue)] + existingPeople
} else {
return existingPeople
}
}
}
和支持的类型:
enum Person: String, Hashable, CaseIterable {
case John
case Paul
case George
case Ringo
}
enum PersonSuggestion: Hashable, Identifiable {
case new(name: String)
case existing(person: Person)
var id: String {
switch self {
case .new(let name):
"+ " + name
case .existing(let person):
person.rawValue
}
}
}
当我在文本字段中输入第一个字母时,ForEach
的行数从零变为非零的数字(符合预期),并且文本字段失去焦点(不符预期)。当我重新聚焦并继续输入时,行数减少时不再失去焦点。只有在文本从空变为非空时才会失去焦点。
如果我将TextField
和ForEach
放在不同的Section
中,问题就不会发生。但是,我需要所有的行都在一个部分中,所以这不太好。
如上所述,我在StackOverflow上找到的所有类似问题都是关于使用绑定参数的ForEach
。这个问题没有使用绑定参数,提到的解决方案都没有起作用。我在这里漏掉了什么?你能帮我找到更好的解决办法吗?:-)
解决方案
我认为这不是故意的 – 可能是 SwiftUI 的一个bug。
这似乎是因为给ForEach
一个空集合导致的。如果你只是这样做:
if !suggestions.isEmpty {
ForEach(suggestions) { onePerson in
Text(onePerson.id)
}
}
那么就没有问题,尽管代码看起来真的很蠢 😀