listview - 过滤列表项后,ListView 中的 SwiftUI TextField 变为空白
问题描述
我正在开发一个显示可编辑项目列表的 iOS 应用程序。为此,我使用List
andTextField
来处理这些项目中的每一个。
我的应用程序有一些按钮,允许用户过滤当前显示在此列表中的信息。我遇到了一个问题,导致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
值不会变为空白,除非它是列表中的最后一项。我开始闻起来像虫子
解决方案
此问题现已在最新的 Xcode beta (11.4) 中得到修复
推荐阅读
- r - 如何在 R 中使用 dplyr 对基于组的值进行归一化?
- reactjs - 反应 momentJS 获取当前日期的句点
- ssl - DNS 记录设置正确和服务器 IP 加载,但域仍然不起作用
- python - 未在数据框中填充 NaN 值
- c# - 使用新式身份验证从 SharePoint 下载文件
- apache-flink - 是否可以以编程方式设置 flink `state.checkpoint.dir`?
- reactjs - React Vis 水平十字准线
- server - 绝望的业务傻瓜寻求帮助 - SSH2 连接到 FTP 服务器
- firebase - 如何在发送到 Firebase 之前验证数据 - Flutter
- python - 从 pandas 数据框创建嵌套字典