【问题标题】:Search through list (JSON) SwiftUI搜索列表 (JSON) SwiftUI
【发布时间】:2020-04-24 01:32:08
【问题描述】:

我是 SwiftUI 的新手。我目前正在编写 Apple Developer 网站上提供的教程。

我正在查看“处理用户输入”部分,我有一个问题。他们在那里获取 JSON 文件并使用它来填充列表。他们从那里创建“收藏夹”切换。我的问题是,是否有可能使 JSON 列表可搜索?

import SwiftUI

struct LandmarkList: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $userData.showFavoritesOnly) {
                    Text("Favorites only")
                }

                ForEach(landmarkData) { landmark in
                    if !self.userData.showFavoritesOnly || landmark.isFavorite {
                        NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        LandmarkList()
            .environmentObject(UserData())
    }
}

我找到了一种制作搜索字段的方法,看起来像这样:

struct SearchBar: UIViewRepresentable {

    @Binding var text: String
    var placeholder: 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
        searchBar.placeholder = placeholder
        searchBar.searchBarStyle = .minimal
        searchBar.autocapitalizationType = .none
        return searchBar
    }

    func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
        uiView.text = text
    }
}

然后调用它,但我找不到搜索列表的方法。我发现很多教程展示了如何搜索数组,但这不是很有帮助。 我尝试了几件事,这是其中之一,但它不起作用:

var body: some View {
        NavigationView {
            VStack {
                SearchBar(text: $searchText, placeholder: "Search")

                List(LandmarkData.filter{searchText == "" ? true : $0.localizedCaseInsensitiveContains(searchText)}, id: \.self){ landmark in
                    LandmarkRow(landmark: landmark)
                }

            }.navigationBarTitle("Landmarks")
        }
    }
}

有人可以向我解释我做错了什么吗?谢谢

【问题讨论】:

    标签: json swiftui


    【解决方案1】:

    我找到了答案:

    List {
        ForEach(LandmarkData.filter {
            $0.name.lowercased().contains(self.searchText) || self.searchText.isEmpty 
        }, id: \.self) { landmark in
            LandmarkRow(landmark: landmark)
        }
    }
    

    其余代码保持不变 :) 希望它会帮助某人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2016-08-05
      • 1970-01-01
      • 2020-06-26
      • 2013-10-28
      相关资源
      最近更新 更多