【发布时间】:2021-01-12 11:38:34
【问题描述】:
我的应用程序中有几个不同的视图,用户可以在它们之间切换。其中一个视图是我创建的 SearchView。此视图可用于在文档中搜索用户指定的字符串,然后选择要跳转到的搜索结果之一。这是通过在用户按下搜索按钮时生成一堆搜索结果来实现的。每个搜索结果都是其他视图的组合,这导致搜索过程和搜索结果生成过程需要相当长的时间,这在最初发生时很好。我的问题是,如果用户在搜索视图中进行搜索,切换到另一个视图,然后返回到搜索视图,则需要很长时间才能重新创建所有搜索结果视图。
如何将搜索视图或搜索结果视图保存在某个变量中,该变量不会被清除以允许重复使用之前生成的搜索视图结果?
我已经使用环境对象来存储用于创建搜索结果的数据,例如搜索字符串、示例文本、章节等。这样在切换回搜索视图时不会重新创建数据,唯一的问题在于视图本身。
这是搜索视图结构:
@EnvironmentObject var modelView: ModelView
var OnJumpToSearchResult: ((Int) -> Void)?
var body: some View {
ScrollView {
HStack {
//Search Field
HStack {
TextField("Search string here", text: $modelView.searchString)
}
.padding()
.background(Color(.systemGray5))
.cornerRadius(6)
.padding(.horizontal)
//Search Button
Button(action: { modelView.searchResults = PerformSearch(pages: modelView.searchPages, pageHeadings: modelView.pageHeadings, searchString: modelView.searchString, sampleRadius: sampleRadius) }, label: {
Text("Search")
.padding(.trailing)
})
}
//Display Search Results
if modelView.searchResults.isEmpty {
EmptyView()
}
else
{
ForEach(modelView.searchResults, id: \.self) { searchResult in
Button(action: {
if OnJumpToSearchResult != nil {
OnJumpToSearchResult?(searchResult.pageNumber - 1) }
}) {
VStack {
Text("\(searchResult.heading)")
.bold()
HStack {
HighlightedTextView(String(searchResult.sampleText), matching: modelView.searchString, caseInsensitive: true)
Spacer()
Text("s.\(searchResult.pageNumber)")
}
.padding()
}
Divider()
.background(Color(.systemGray4))
.padding(.leading)
}
}
}
}
}
搜索视图的父视图在初始化时初始化一个搜索视图,并在更新时重用它(而不是重新初始化一个新视图)。
【问题讨论】:
-
您需要存储搜索到的数据而不是视图,而视图只会绘制该数据。