Поиск по списку (JSON) SwiftUI - PullRequest
0 голосов
/ 16 апреля 2020

Я новичок в 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")
        }
    }
}

Может кто-нибудь объяснить мне, что я делаю неправильно? Спасибо

1 Ответ

0 голосов
/ 23 апреля 2020

Я нашел ответ на него:

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

Остальная часть кода осталась прежней :) Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...