Swift 在List中当ForEach添加行时TextField失去焦点

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 的行数从零变为非零的数字(符合预期),并且文本字段失去焦点(不符预期)。当我重新聚焦并继续输入时,行数减少时不再失去焦点。只有在文本从空变为非空时才会失去焦点。

如果我将TextFieldForEach放在不同的Section中,问题就不会发生。但是,我需要所有的行都在一个部分中,所以这不太好。

如上所述,我在StackOverflow上找到的所有类似问题都是关于使用绑定参数的ForEach。这个问题没有使用绑定参数,提到的解决方案都没有起作用。我在这里漏掉了什么?你能帮我找到更好的解决办法吗?:-)

解决方案

我认为这不是故意的 – 可能是 SwiftUI 的一个bug。

这似乎是因为给ForEach一个空集合导致的。如果你只是这样做:

if !suggestions.isEmpty {
    ForEach(suggestions) { onePerson in
        Text(onePerson.id)
    }
}

那么就没有问题,尽管代码看起来真的很蠢 😀

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程