此项目已过时

iOS 15 引入了 .searchable(),它是 SwiftUI 的官方搜索栏实现。因此,本项目现在已过时。我将继续保留这个项目,作为针对 iOS 15 以下版本的应用程序的polyfill。但是,此项目将不再进行积极开发,您应该尽快切换到新的系统。感谢各位的支持,祝大家编程愉快!

SwiftlySearch

一个小型、轻量级的 SwiftUI UISearchController 封装器

安装

手动

更新您的 Package.swift 文件

let package = Package(
  ...,

  dependencies: [
    .package(
      url: "https://github.com/thislooksfun/SwiftlySearch.git",
      from: "1.0.0"),

    ...
  ],

  ...
)

在 Xcode 中

  1. 前往 “File” > “Swift Packages” > “Add Package Dependency...”
  2. 输入 https://github.com/thislooksfun/SwiftlySearch 作为网址
  3. 选择您所需的版本约束
  4. 点击 “下一步”
  5. 点击 “完成”

用法

import SwiftlySearch

struct MRE: View {
  let items: [String]

  @State
  var searchText = ""

  var body: some View {
    NavigationView {
      List(items.filter { $0.localizedStandardContains(searchText) }) { item in
        Text(item)
      }.navigationBarSearch(self.$searchText)
    }
  }
}

已知问题

(#12) resultContent 内部的 NavigationLink 无法正常工作。这是 UIKit/SwiftUI 交互的局限性,因此我无能为力。如果您需要一个单独的视图来显示搜索结果,您可以使用如下所示的解决方法

struct ContentView: View {
    @State
    var searchText: String = ""

    var body: some View {
        NavigationView {
            ZStack {
                if searchText.isEmpty {
                    NormalView()
                } else {
                    SearchResultsView(text: searchText)
                }
            }
            .navigationBarSearch($searchText)
        }
    }
}

struct NormalView: View {
    var body: some View {
        Text("Some view")
    }
}

struct SearchResultsView: View {
    var text: String

    var body: some View {
        VStack {
            Text("You searched for \(text)")
            NavigationLink(destination: Text(text)) {
                Text("Let's go!")
            }
        }
    }
}