我有一个本地 json 文件,并且我已经将其加载到我的项目中。 json 文件中的数据如下所示:
[
{"id": 1, "hanzi": "安全", "pinyin": "ān quán", "imageName": "a"},
{"id": 2, "hanzi": "安静", "pinyin": "ān jìng", "imageName": "b"},
{"id": 3, "hanzi": "帮助", "pinyin": "bāng zhù", "imageName": "c"},
{"id": 4, "hanzi": "白天", "pinyin": "bán tiān", "imageName": "d"},
{"id": 5, "hanzi": "摆", "pinyin": "bǎi","imageName": "e"}
]
我创建了 VocabList.swift 来使用 NavigationView 显示数据。现在我想添加一个搜索栏,以便能够使用两个不同的键“汉字”和“拼音”搜索数据。
我按照在线教程创建了 Searchbar.swift。我可以在 VocabList.swift 中调用它,没有任何问题,但是当我尝试定义过滤器时,它报告错误“无法为不正确或不明确类型的值添加下标”。
这是 Searchbar.swift:
import SwiftUI
struct SearchBar: UIViewRepresentable {
@Binding var text: String
class Coordinator: NSObject, UISearchBarDelegate{
@Binding var text: String
init(text: Binding<String>) {
_text = text
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
text = searchText
}
}
func makeCoordinator() -> SearchBar.Coordinator {
return Coordinator(text: $text)
}
func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
let searchBar = UISearchBar(frame:.zero)
searchBar.delegate = context.coordinator
return searchBar
}
func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
uiView.text = text
}
}
这是 VocabList.swift:
@State private var searchTerm: String = ""
var body: some View {
NavigationView {
VStack {
SearchBar(text: $searchTerm)
List(vocabData.filter{
($0["hanzi"] as! String).range(of: searchTerm!) != nil ||
($0["pinyin"] as! String).range(of: searchTerm!) != nil
})
{ vocab in
NavigationLink(destination: VocabDetail(vocab: vocab)) {
VocabRow(vocab: vocab)
}
}
.navigationBarTitle(Text("Vocab"))
}
}
}
我对编码非常陌生。我不知道哪里出了问题。有人可以帮助我吗?非常感谢!
最佳答案
修改 Coordinator 类中的“searchBar - textDidChange”方法,如下所述
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
// filteredData here is the result, data is the local array
filteredData = searchText.isEmpty ? data : data.filter { (item: String) -> Bool in
// If dataItem matches the searchText, return true to include it
return item.range(of: searchText, options: .caseInsensitive, range: nil, locale: nil) != nil
}
// Reload UI element as per your requirement
}
关于json - 如何使用搜索栏过滤本地Json文件中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60087539/