Searchable
Skip support for SwiftUI.View.searchable ↗ on Android. Consult the SkipUI module for a complete list of supported SwiftUI.
The following example screens and source code is from SkipUI’s
Showcase sample app
SearchablePlayground.swift ↗
import Foundationimport SwiftUI
enum SearchablePlaygroundType: String, CaseIterable { case list case plainList case submit case isSearching
var title: String { switch self { case .list: return "List" case .plainList: return "Plain style" case .submit: return "Submit" case .isSearching: return "isSearching" } }}
struct SearchablePlayground: View { var body: some View { List(SearchablePlaygroundType.allCases, id: \.self) { type in NavigationLink(type.title, value: type) } .toolbar { PlaygroundSourceLink(file: "SearchablePlayground.swift") } .navigationDestination(for: SearchablePlaygroundType.self) { switch $0 { case .list: ListSearchablePlayground() .navigationTitle($0.title) case .plainList: PlainListSearchablePlayground() .navigationTitle($0.title) case .submit: SubmitSearchablePlayground() .navigationTitle($0.title) case .isSearching: IsSearchingSearchablePlayground() .navigationTitle($0.title) } } }}
struct ListSearchablePlayground: View { @State var searchText = ""
var body: some View { List { ForEach(matchingAnimals(), id: \.self) { Text($0) } } .searchable(text: $searchText) }
func matchingAnimals() -> [String] { return animals().filter { $0.lowercased().starts(with: searchText.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) } }}
struct PlainListSearchablePlayground: View { @State var searchText = ""
var body: some View { List { ForEach(matchingAnimals(), id: \.self) { Text($0) } } .listStyle(.plain) .searchable(text: $searchText) }
func matchingAnimals() -> [String] { return animals().filter { $0.lowercased().starts(with: searchText.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) } }}
struct SubmitSearchablePlayground: View { @State var searchText = "" @State var matchingAnimals = animals()
var body: some View { List { ForEach(matchingAnimals, id: \.self) { Text($0) } } .searchable(text: $searchText) .onSubmit(of: .search) { matchingAnimals = animals().filter { $0.lowercased().starts(with: searchText.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)) } } }}
struct IsSearchingSearchablePlayground: View { @State var searchText = ""
var body: some View { IsSearchingView() .searchable(text: $searchText) }
private struct IsSearchingView: View { @Environment(\.isSearching) var isSearching
var body: some View { List { Text("isSearching:") if isSearching { Text("YES").foregroundStyle(.green) } else { Text("NO").foregroundStyle(.red) } } } }}
func animals() -> [String] { return [ "Alligator", "Ant", "Bat", "Bear", "Cat", "Cheetah", "Dog", "Dolphin", "Eagle", "Elephant", "Flamingo", "Fox", "Goat", "Gorilla", "Hippo", "Horse", "Ibis", "Insect", "Jackrabbit", "Jellyfish", "Kangaroo", "Kingfisher", "Lampfish", "Llama", "Manitee", "Monkey", "Narwhal", "Nightingale", "Octopus", "Ocelot", "Penguin", "Pufferfish", "Quahog", "Quail", "Rat", "Rhinocerous", "Snake", "Squirrel", "Tarantula", "Turtle", "Unicorn", "Vole", "Vulture", "Walrus", "Whale", "Yak", "Zebra" ]}