SwiftUI-搜索列表头

Dan*_*iel 8 search textfield uitableview swiftui

我试图用SwiftUI重新创建每个人从UITableView知道的东西:tableview标题中的一个简单搜索字段:

tableview标题中的一个简单搜索字段

但是,SwiftUI中的列表视图似乎甚至没有添加页眉或页脚的方法。您可以将带有TextField的标题设置为以下部分:

@State private var searchQuery: String = ""

var body: some View {

List {
    Section(header:
        Group{
            TextField($searchQuery, placeholder: Text("Search"))
                                .background(Color.white)
            }) {
                  ListCell()
                  ListCell()
                  ListCell()
                }

    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定这是否是最佳方法,因为:

  1. 从UITableView知道向下滚动时,标题不会隐藏。
  2. SearchField看起来不像我们知道和喜欢的搜索字段。

有没有人找到好的方法?我不想依靠UITableView。

Mat*_*ini 16

您可以移植UISearchBar到SwiftUI。

(有关此问题的更多信息,请参见WWDC 2019精彩演讲- 集成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
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

struct ContentView: View {

    @State private var searchQuery: String = ""

    var body: some View {

        List {
            Section(header: SearchBar(text: self.$searchQuery)) {
                ForEach(Array(1...100).filter {
                    self.searchQuery.isEmpty ?
                        true :
                        "\($0)".contains(self.searchQuery)
                }, id: \.self) { item in
                    Text("\(item)")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它是正确的搜索栏,但不会隐藏-我确信我们可以通过SwiftUI API在某个时候做到这一点。

看起来像这样

在此处输入图片说明

更新了Xcode 11 beta 5

  • 如果不将其放在标题中,则会得到更好的外观。而是将其放在间距为0的VStack中,并包含搜索栏和列表:`VStack(alignment:.center,interval:0){SearchBar(text:self。$ searchQuery); 列出{...`。这样,您就可以使用整个宽度,并且搜索栏始终保持在顶部。 (2认同)

Flo*_*rin 5

也许这里是一个起点。考虑使用ZStack滚动视图滚动消失效果。


struct ContentView: View {
    @State var search: String

    var body: some View {
        NavigationView {
            VStack(alignment: .center, spacing: 0) {
                HStack {
                    Image(systemName: "magnifyingglass")
                        .padding(.leading, CGFloat(10.0))
                    TextField("Search", text: $search, onEditingChanged: { active in
                        print("Editing changed: \(active)")
                    }, onCommit: {
                        print("Commited: \(self.search)")
                    })
                        .padding(.vertical, CGFloat(4.0))
                        .padding(.trailing, CGFloat(10.0))
                }
                    .overlay(
                        RoundedRectangle(cornerRadius: 5.0)
                            .stroke(Color.secondary, lineWidth: 1.0)
                    )
                    .padding()
                List {
                    ForEach(0...100, id: \.self) { e in
                        Text("Item \(e)")
                    }
                }
            }
            .navigationBarTitle(title(for: self.search))
        }
    }

    private func title(for value: String?) -> String {
        guard let value = value, value.count > 0 else {
            return "No search"
        }

        return #"Searching for "\#(value)""#
    }
}

Run Code Online (Sandbox Code Playgroud)

截屏