【问题标题】:Prevent NavigationLink from processing state variable防止 NavigationLink 处理状态变量
【发布时间】:2019-10-19 12:40:55
【问题描述】:

我不喜欢我的标题,但这是我能想到的最好的标题。基本上,我有两个视图:SearchInput 和 SearchResultList。用户使用 SearchInput 输入搜索词,点击“Go”,然后使用 SearchResultList 查看搜索结果。代码是:

struct SearchInput: View {
    @State private var searchTerm: String = ""

    var searchResult: [RTDocument] {
        return RuntimeDataModel.shared.fetchRTDocuments(matching: self.searchTerm)
    }

    var body: some View {
        NavigationView {
            VStack {
                TextField("Enter search term...", text: self.$searchTerm)

                NavigationLink(destination: SearchResultList(
                    rtDocuments: self.searchResult
                )) { Text("Go") } //NavigationLink
            } //VStack
        } //NavigationView
    } //body
} //SearchInput

我遇到的问题是,每次用户在 TextField 中输入一个字符时,绑定状态变量 searchTerm 都会更新,这会导致 NavigationLink 重新评估其目的地——这会导致在计算的 searchResult 变量中获取核心数据.

我希望提取只发生一次,当用户点击“Go”时。有没有办法做到这一点?

【问题讨论】:

    标签: ios swiftui


    【解决方案1】:

    这是预期的行为,因此通常您应该重新设计 SearchResultList,但这可以作为一种解决方法:

    声明输入的状态:

    @State var shouldNavigate = false
    

    然后将按钮与导航链接分开。

    Group {         
        Button("Go") {
            self.shouldNavigate = true
        }
        NavigationLink(destination: Text("SearchResultList"),
                       isActive: $shouldNavigate) {
            EmptyView()
        }
     }
    

    【讨论】:

    • 谢谢。当您说重新设计时,您的意思是我应该只将 searchTerm (String) 发送到 SearchResult List,然后让 SearchResultList 进行提取吗?
    • 我认为您应该将一些不会导致 CoreData 提取并在 .onAppear 中启动提取的内容传递到您的 SearchResultList 中。也许只是搜索词?
    猜你喜欢
    • 2011-05-20
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多