首页 > 解决方案 > 过滤列表项后,ListView 中的 SwiftUI TextField 变为空白

问题描述

我正在开发一个显示可编辑项目列表的 iOS 应用程序。为此,我使用ListandTextField来处理这些项目中的每一个。

我的应用程序有一些按钮,允许用户过滤当前显示在此列表中的信息。我遇到了一个问题,导致TextField值在被过滤后变为空白,而且我一生都无法弄清楚我做错了什么。

这是一个非常基本的复制:

import SwiftUI

let allItems = ["1. Foo", "1. Bar", "1. Baz", "2. Goo", "2. Gar", "2. Gaz"]

struct ContentView: View {
    @State private var items = [String]()
    @State private var filterPrefix = "1"

    var body: some View {
        NavigationView {
            List {
                ForEach(items, id: \.self) { item in
                    RowView(item: item)
                }
            }
            .navigationBarItems(trailing: Button("Toggle") {
                self.filterPrefix = (self.filterPrefix == "1" ? "2" : "1")
                self.items = allItems.filter { $0.starts(with: self.filterPrefix) }
            })
            .navigationBarTitle("Items", displayMode: .inline)
        }
        .onAppear {
            self.items = allItems.filter { $0.starts(with: self.filterPrefix) }
        }
    }
}

struct RowView: View {
    var item: String

    @State private var inputText = ""

    var body: some View {
        VStack {
            TextField("", text: $inputText)
        }
        .onAppear {
            print("Item: \(self.item)") // This prints the item successfully
            self.inputText = self.item
        }
    }
}

Toggle了几次之后,TextField最终还是空了。但是,中的代码onAppear仍然可以很好地打印文本值。

这是一个GIF:

例子


难道我做错了什么?我应该TextField在点击时只输入吗?(似乎不是一个好主意,但我不知道为什么这不起作用)

我在 Xcode 11.2 beta 2 (11B44) 上运行,但同样的问题发生在 11.1 以及 iOS 13.1 和 13.2


编辑:为了使事情更复杂,我更改了行以包括文本和文本字段:

        HStack {
            Text(item)
            TextField("", text: $inputText)
        }

现在该TextField值不会变为空白,除非它是列表中的最后一项。我开始闻起来像虫子

标签: listviewtextfieldswiftui

解决方案


此问题现已在最新的 Xcode beta (11.4) 中得到修复


推荐阅读