Nano Hash - криптовалюты, майнинг, программирование

SwiftUI Поймайте значение средства выбора из другого представления

Мне нужно добавить панель поиска и значение nil в средство выбора. Я хочу создать настраиваемое средство выбора и использовать его везде, чтобы избежать повторения кода. Мне удалось создать средство выбора, используя this и этот код, но я не смог найти, как записать выбранное значение в другом представлении.

Этот код помогает мне искать в сборщике.

    struct SearchBar: UIViewRepresentable {

    @Binding var text: String
    var placeholder: String

    func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
        let searchBar = UISearchBar(frame: .zero)
        searchBar.delegate = context.coordinator

        searchBar.placeholder = placeholder
        searchBar.autocapitalizationType = .none
        searchBar.searchBarStyle = .minimal
        return searchBar
    }

    func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
        uiView.text = text
    }

    func makeCoordinator() -> SearchBar.Coordinator {
        return Coordinator(text: $text)
    }

    class Coordinator: NSObject, UISearchBarDelegate {

        @Binding var text: String

        init(text: Binding<String>) {
            _text = text
        }

        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            text = searchText
        }
    }
}

Это созданный мной пользовательский сборщик.

struct CustomPicker<Item>: View where Item: Hashable {
    let items: [Item]
    let title: String
    let text: KeyPath<Item, String>
    let needOptional: Bool
    let needSearchBar: Bool
    
    @State var item: Item? = nil
    @State var searchText: String = ""
    
    var filteredItems: [Item] {
        items.filter {
            searchText.isEmpty ? true : $0[keyPath: text].lowercased().localizedStandardContains(searchText.lowercased())
        }
    }
    
    var body: some View {
        Picker(selection: $item, label: Text(title)) {
            if needSearchBar {
                SearchBar(text: $searchText, placeholder: "Search")
                    .padding(.horizontal, -12)
            }
            
            if needOptional {
                Text("[none]").tag(nil as Item?)
                    .foregroundColor(.red)
            }
            
            ForEach(filteredItems, id: \.self) { item in
                Text(item[keyPath: text])
                    .tag(item as Item?)
            }
        }
        .onAppear{
            searchText = ""
        }
    }
}

использование

Пример модели страны

struct Country: Codable, Identifiable, Hashable {
    let id = UUID()
    let name: String

    enum CodingKeys: String, CodingKey {
        case id, name
    }
}

в ContentView

Form {
CustomPicker(items: countryArray, title: "Country", text: \Country.name, needOptional: true, needSearchBar: true)
}

результат

Как мне поймать выбранный элемент (необязательно) в ContentView?

08.02.2021

Ответы:


1

Используйте @Binding, чтобы привязать ваш элемент.

struct CustomPicker<Item>: View where Item: Hashable {
    let items: [Item]
    let title: String
    let text: KeyPath<Item, String>
    let needOptional: Bool
    let needSearchBar: Bool
    
    @Binding var item: Item? // <--Here
    @State var searchText: String = ""
    
    
    //-----Other code---------//

И используйте @State здесь в представлении содержимого для получения выбранного значения.

struct ContentView: View {
    
    @State private var selectedItem: Country? //<-- Here
    
    private let countryArray: [Country] = [.init(name: "A"), .init(name: "B")]
    
    var body: some View {
        Form {
            CustomPicker(items: countryArray, title: "Country", text: \Country.name, needOptional: true, needSearchBar: true, item: $selectedItem) // <-- Here
            if let selectedItem = selectedItem {
                Text(selectedItem.name)
            }
        }
    }
}
08.02.2021
  • Спасибо, я пробовал использовать @Binding var item: Item? = ноль каждый раз. 08.02.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..