为什么导航栏中的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()) })
                }
            }
        }

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

他的脾气

问题是NavigationView完全重建,导致文本字段焦点丢失。

这是工作方法。经过Xcode 11.4 / iOS 13.4测试

这样做的目的是避免NavigationView基于SwiftUI引擎更新修改后的视图的知识而进行重建,因此使用分解功能,我们可以进行本地修改,并且仅在不影响top的子视图之间传输所需的值NavigationView,从而保持最后一个立场。

演示

class QueryModel: ObservableObject {
    @Published var query: String = ""
}

struct ContentView: View {
    // No QueryModel environment object here - 
    //                implicitly passed down. !!! MUST !!!

    var body: some View {
        NavigationView {
            ResultsView()
                .navigationBarTitle(Text("Library"))
                .navigationBarItems(trailing: SearchItem())
        }
    }
}

struct ResultsView: View {
    @EnvironmentObject var qm: QueryModel // << injected here from top
    var body: some View {
        VStack {
            Text("Search: \(qm.query)") // receive query string
        }
    }
}

struct SearchItem: View {
    @EnvironmentObject var qm: QueryModel // << injected here from top
    @State private var query = "" // updates only local view

    var body: some View {
        let text = Binding(get: { self.query }, set: {
            self.query = $0; self.qm.query = $0;       // transfer query string
        })
        return TextField("search", text: text)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView().environmentObject(QueryModel())
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在C ++中std :: string变量一次只能接受1个字符?

来自分类Dev

尝试从文件中打印随机行,但一次只能打印一个字符

来自分类Dev

循环一次在一个字符中创建字符串

来自分类Dev

从字符串中删除一个字符一次

来自分类Dev

在Swift 2.0中一次显示一个字符

来自分类Dev

如何一次从python文件中读取一个字符?

来自分类Dev

一次从文本文件中读取一个字符

来自分类Dev

一次更改一个字符串中的一个字符,不更改字符串吗?

来自分类Dev

使用循环一次在一个字符中创建字符串

来自分类Dev

在字符串C#中输出一个字符的一次出现

来自分类Dev

如何从列表中取出字符串并一次比较一个字符

来自分类Dev

一次更改一个字符串中的字母(Pandas,Python3)

来自分类Dev

如何从一个字符串中一次读取两个字符并复制到另一个字符串中

来自分类Dev

多次向mysql中插入字符串,一次删除一次删除最后一个字符

来自分类Dev

如何知道输入中输入的最后一个字符-Javascript

来自分类Dev

删除输入中输入的最后一个字符-Javascript

来自分类Dev

如何从c中没有空格的字符串中一次获取一个字符?

来自分类Dev

为什么sed一次不能匹配一个文件中的多个字符?

来自分类Dev

计算一个字符在一个字符串中改变多少次

来自分类Dev

为什么在第二次迭代中跳过第一个字符

来自分类Dev

为什么使用 char 变量从文件中读取一个字符又吃了一个下一个字符?

来自分类Dev

在freemarker中重复一个字符串n次

来自分类Dev

我如何只让用户在c中输入一个字符

来自分类Dev

无法从输入React JS的搜索中删除第一个字符

来自分类Dev

在系统函数中输入一个字符串

来自分类Dev

从输入中删除最后一个字符时,Div不刷新

来自分类Dev

我如何只让用户在c中输入一个字符

来自分类Dev

如何在字符第一次(也是第一次)出现后将字符串插入到另一个字符串中

来自分类Dev

Java中的最后一个字符

Related 相关文章

  1. 1

    为什么在C ++中std :: string变量一次只能接受1个字符?

  2. 2

    尝试从文件中打印随机行,但一次只能打印一个字符

  3. 3

    循环一次在一个字符中创建字符串

  4. 4

    从字符串中删除一个字符一次

  5. 5

    在Swift 2.0中一次显示一个字符

  6. 6

    如何一次从python文件中读取一个字符?

  7. 7

    一次从文本文件中读取一个字符

  8. 8

    一次更改一个字符串中的一个字符,不更改字符串吗?

  9. 9

    使用循环一次在一个字符中创建字符串

  10. 10

    在字符串C#中输出一个字符的一次出现

  11. 11

    如何从列表中取出字符串并一次比较一个字符

  12. 12

    一次更改一个字符串中的字母(Pandas,Python3)

  13. 13

    如何从一个字符串中一次读取两个字符并复制到另一个字符串中

  14. 14

    多次向mysql中插入字符串,一次删除一次删除最后一个字符

  15. 15

    如何知道输入中输入的最后一个字符-Javascript

  16. 16

    删除输入中输入的最后一个字符-Javascript

  17. 17

    如何从c中没有空格的字符串中一次获取一个字符?

  18. 18

    为什么sed一次不能匹配一个文件中的多个字符?

  19. 19

    计算一个字符在一个字符串中改变多少次

  20. 20

    为什么在第二次迭代中跳过第一个字符

  21. 21

    为什么使用 char 变量从文件中读取一个字符又吃了一个下一个字符?

  22. 22

    在freemarker中重复一个字符串n次

  23. 23

    我如何只让用户在c中输入一个字符

  24. 24

    无法从输入React JS的搜索中删除第一个字符

  25. 25

    在系统函数中输入一个字符串

  26. 26

    从输入中删除最后一个字符时,Div不刷新

  27. 27

    我如何只让用户在c中输入一个字符

  28. 28

    如何在字符第一次(也是第一次)出现后将字符串插入到另一个字符串中

  29. 29

    Java中的最后一个字符

热门标签

归档