json - 如何使用搜索栏过滤本地Json文件中的数据

标签 json swift filter searchbar

我有一个本地 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/

相关文章:

java - 序列化嵌套的 JSON 数组

python - 在 Python 中的 For 语句中为输入字段循环一个变量

swift - 重新加载 TableView 时出错(更新前删除行)

ios - 搜索处于事件状态时导航栏问题并推送到下一个 View Controller

javascript - url 上的回调函数?

java - 如何使用GSON解析变量名JSON对象?

c# - 使用 C# asp.net 打印 json

ios - 在文本 Swift,IOS 中将英文数字更改为波斯数字

javascript - 从数组中过滤日期范围

java - 应用比较器和谓词的顺序重要吗?