为什么导航栏中的SwiftUI TextField一次只能接受一个字符的输入

时间:2020-04-20 14:54:09

标签: swiftui textfield

我希望允许用户过滤长列表中的数据,以便更轻松地找到匹配的标题。

我已将TextView放置在导航栏中:

.navigationBarTitle(Text("Library"))
.navigationBarItems(trailing: TextField("search", text: $modelData.searchString)

我有一个可观察的对象,它可以响应搜索字符串中的变化:

class DataModel: ObservableObject {
   @Published var modelData: [PDFSummary]
   @Published var searchString = "" {
            didSet {
                if searchString == "" {
                    modelData =  Realm.studyHallRealm.objects(PDFSummary.self).sorted(by: { $0.name < $1.name })
                } else {
                    modelData =  Realm.studyHallRealm.objects(PDFSummary.self).sorted(by: { $0.name < $1.name }).filter({ $0.name.lowercased().contains(searchString.lowercased()) })
                }
            }
        }

一切正常,除了我必须在输入每个字母后点击字段。由于某些原因,输入每个字母后,焦点将移离字段(除非我点击建议的自动更正-整个字符串立即正确添加到字符串中)

1 个答案:

答案 0 :(得分:2)

问题在于完全重建RewriteEngine On DirectoryIndex test.html 导致文本字段焦点丢失。

这是可行的方法。使用Xcode 11.4 / iOS 13.4进行了测试

该想法是避免基于SwiftUI引擎仅更新 修改视图的知识而重建NavigationView,因此使用分解,我们将修改设置为本地并且仅在不直接影响顶部的子视图之间传递所需的值NavigationView,最后一站。

demo

NavigationView