我不喜欢我的头衔,但这是我能想到的最好的头衔。基本上,我有两个视图: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变量中提取核心数据。
我希望在用户点击“开始”时仅进行一次获取。有没有办法做到这一点?
最佳答案
这是预期的行为,因此通常应该重新设计SearchResultList,但这可以作为一种解决方法:
在输入中声明一个状态:
@State var shouldNavigate = false
然后将按钮从导航链接中分离出来。
Group {
Button("Go") {
self.shouldNavigate = true
}
NavigationLink(destination: Text("SearchResultList"),
isActive: $shouldNavigate) {
EmptyView()
}
}