首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用搜索栏从本地Json文件中过滤数据

如何使用搜索栏从本地Json文件中过滤数据
EN

Stack Overflow用户
提问于 2020-02-06 12:01:43
回答 1查看 539关注 0票数 0

我有一个本地json文件,并且我已经将它加载到我的项目中。json文件中的数据如下所示:

代码语言:javascript
运行
复制
[
    {"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:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
@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"))
        }
    }
}

我对编程非常陌生。我不知道哪里出了问题。有人能帮帮我吗?非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-02-06 12:27:33

修改协调器类中的searchBar-textDidChange方法,如下所述

代码语言:javascript
运行
复制
    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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60087539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档