首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI - SearchBar

SwiftUI - SearchBar
EN

Stack Overflow用户
提问于 2020-05-10 00:28:37
回答 1查看 143关注 0票数 0

我有一个名为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() -> 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
    }
}

然后在ContentView.swift上执行以下命令:

代码语言:javascript
复制
import SwiftUI


struct Geolokation: Decodable,Hashable, Identifiable {
    var date: String
    var id: String
    var latitude: String
    var longitude: String
    var seq_number: String
    var accuracy: String
}

struct GeolokationDetail: View {

    var loka: Geolokation

    var body: some View {

        VStack(alignment: .leading, spacing: 10) {
            Text(loka.id)
                .font(.headline)
            MapView(escolha: loka.id).edgesIgnoringSafeArea(.all)
        }
    }
}

struct ContentView: View {

    // init(){
    //  UINavigationBar.appearance().backgroundColor = .lightGray

    //    }

    @State private var lokaData = [Geolokation]()
    @State private var searchText : String = ""

    var body: some View {

        NavigationView{

            VStack {
                SearchBar(text: $searchText)
                List {

                    ForEach (lokaData) {
                      item in
                        NavigationLink(destination: GeolokationDetail(loka: item)) {
                            HStack() {
                                Text(item.id)
                                    .font(.headline)
                                Text(item.date)
                                    .font(.footnote)
                            }
                        }

                    }.navigationBarTitle("GeoLOKAtion")

                }

                .onAppear(perform: loadData)


            }

        }

    }


}

extension ContentView
{
    func loadData() {

        guard let url = URL(string: "https://xxxx.com") else {
            return
        }

        let request = URLRequest(url: url)
        URLSession.shared.dataTask(with: request) { data, response, error in

            if let data = data {
                if let response_obj = try? JSONDecoder().decode([Geolokation].self, from: data) {
                    DispatchQueue.main.async {
                        self.lokaData = response_obj
                    }
                }
            }

        }.resume()
    }
}



struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

但是我还没能找到一种在列表中实现搜索的方法。

我打算做一些类似这样的事情:

代码语言:javascript
复制
ForEach(self.lokaData.filter {
    self.searchText.isEmpty ? true : $0.contains(self.searchText)
}, id: \.self) 

但它不起作用。我遗漏了一些我不理解的概念。有什么想法吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-10 22:12:11

你正在对一个结构应用contains,这就是为什么你会得到这个错误,你应该把它应用到Geolokation的一个属性上,下面是一个在latitud上查找匹配的例子:

代码语言:javascript
复制
struct MyView: View {

    @State private var lokaData = [Geolokation.init(date: "date 1", id: "0", latitude: "1010", longitude: "2020", seq_number: "1234", accuracy: ""),
                                   Geolokation.init(date: "date 2", id: "1", latitude: "1020", longitude: "2030", seq_number: "5678", accuracy: ""),
                                   Geolokation.init(date: "date 3", id: "2", latitude: "1030", longitude: "2040", seq_number: "9101", accuracy: "")]
    var body: some View {
        VStack {
            //SearchBar
            ForEach(self.lokaData.filter {
                $0.latitude.contains(self.searchText)
            }, id: \.self) { item in
                Text(item.latitude)
            }
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61700110

复制
相关文章

相似问题

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