过滤列表项后,ListView 中的 SwiftUI TextField 变为空白

Posted

技术标签:

【中文标题】过滤列表项后,ListView 中的 SwiftUI TextField 变为空白【英文标题】:SwiftUI TextField inside ListView goes blank after filtering list items 【发布时间】:2019-10-30 08:59:18 【问题描述】:

我正在开发一个 ios 应用程序,该应用程序显示可编辑的项目列表。为此,我将ListTextField 分别用于这些项目。

我的应用程序有一些按钮允许用户过滤当前显示在此列表中的信息。我遇到了一个问题,导致 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 值不会变为空白,除非它是列表中的最后一项。我开始闻起来像虫子

【问题讨论】:

肯定有错误,我将RowView 包裹在NavigationLink 中,似乎阻止它们消失, @Andrew 很有趣!同样的结果在这里,看起来确实像一个错误......那很不幸 自从更新到 Xcode 11.2 后,我的应用程序中的列表变得非常有问题。对齐问题,文本字段消失,无法删除行(索引超出范围错误) 你能解决这个问题吗?试试文本字段的 .id() 修饰符,它在某些情况下对我有帮助。 【参考方案1】:

这个问题现已在最新的 Xcode 测试版 (11.4) 中得到修复

【讨论】:

以上是关于过滤列表项后,ListView 中的 SwiftUI TextField 变为空白的主要内容,如果未能解决你的问题,请参考以下文章

单击 Xamarin.Forms 中的 ListView 项后完整显示详细信息

Listview自定义过滤器在过滤列表中单击错误的项目

显示/隐藏项目 - 列表视图

ListView 中的自定义过滤 ArrayAdapter

无法在颤动中过滤 listview.builder 的列表

过滤后ListView不更新