我有一个本地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"}
]
我使用NavigationView创建了VocabList.swift来显示数据。现在我想添加一个搜索栏,以便能够使用两个不同的关键字-“汉字”和“拼音”来搜索数据。
我按照在线教程创建了Searchbar.swift。我可以在VocabList.swift中毫无问题地调用它,但是当我试图定义过滤器时,它报告了一个错误:"Cannot subscript a value of error or ambiguous type“(无法下标类型不正确或不明确的值)。
下面是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"))
}
}
}
我对编程非常陌生。我不知道哪里出了问题。有人能帮帮我吗?非常感谢!
发布于 2020-02-06 12:27:33
修改协调器类中的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
}
https://stackoverflow.com/questions/60087539
复制相似问题