// // ItemPicker.swift // WorkoutsPlus // Advanced Version of Picker.pickerStyle(NavigationLinkPickerStyle()) that's searchable and has a ContentUnavailableView // // Created by Felix Förtsch on 10.09.24. // import SwiftUI struct ItemPicker: View { @Environment(\.dismiss) private var dismiss @Binding var selectedItem: Item? var items: [Item] @State private var searchText = "" var filteredItems: [Item] { if searchText.isEmpty { return items } else { return items.filter { $0.name.localizedCaseInsensitiveContains(searchText) } } } var body: some View { List { ForEach(filteredItems) { item in HStack { Text(item.name) Spacer() if item == selectedItem { Image(systemName: "checkmark") .foregroundColor(.blue) } } // This .contentShape makes the whole row tappable .contentShape(Rectangle()) .onTapGesture { selectedItem = item dismiss() } } } .searchable(text: $searchText) .overlay { if filteredItems.isEmpty { ContentUnavailableView.search(text: searchText) } } } } private struct Item: Nameable { var id = UUID() var name: String } #Preview { @Previewable @State var selectedItem: Item? = nil NavigationStack { ItemPicker(selectedItem: $selectedItem, items: [ Item(name: "Item 1"), Item(name: "Item 2"), Item(name: "Item 3") ]) } }