Как запустить функцию фильтра, только если текст на панели поиска не пуст? - PullRequest
0 голосов
/ 06 января 2020

У меня есть кнопка поиска и панель поиска в SwiftUi View. Я пытаюсь запустить функцию filter (), когда пользователь вводит данные на панели поиска.

Если я использую кнопку для запуска действия, оно работает, но я хочу, чтобы вызвать действие, когда пользователь печатает в строке .

Я пробовал с помощью if else, но выдает мне предупреждение.

Generi c параметр 'FalseContent' не может быть выведен 1. При вызове функции 'buildEither (first :)' (SwiftUI.ViewBuilder)

вот мой код

struct ContentView: View {
    @ObservedObject var dm: DataManager
    @State private var searchTerm : String = ""
    @State var filteredAirports: [AirportModel] = []

    var body: some View {
        VStack {
            SearchBar(text: $searchTerm)
            if searchTerm == "" {
                /// don't do anything 
            } else {
                self.dm.filter2(valoreSearhed: self.searchTerm, arrayTosearh: self.dm.airportVector)
            }

            List {
                ForEach(dm.appoggio) { valore in
                    Text(valore.aptICAO)
                }
            }
        }
    }
}
``

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Это можно сделать с помощью пользовательского Binding, который выполняет фильтрацию при изменении searchTerm:

    SearchBar(text: $searchTerm.didSet(execute: { _ in self.updateSearchResults() }))

...

extension Binding {
    /// Execute block when value is changed.
    ///
    /// Example:
    ///
    ///     Slider(value: $amount.didSet { print($0) }, in: 0...10)
    func didSet(execute: @escaping (Value) ->Void) -> Binding {
        return Binding(
            get: {
                return self.wrappedValue
            },
            set: {
                self.wrappedValue = $0
                execute($0)
            }
        )
    }
}
0 голосов
/ 06 января 2020

ваша проблема не в вашем if / else, потому что это работает:

, как вы можете видеть, if / else присутствует там, и нет предупреждения компилятора ... Типп: попробуйте закомментировать все операторы, а затем итерируйте, раскомментируя и проверяя, когда компилятор предупреждает вас -> тогда у вас есть ошибка

struct ContentView: View {
    var list = ["1","2","3"]
    @State private var searchTerm : String = ""

    var body: some View {
        VStack {
       //     SearchBar(text: $searchTerm)
            if searchTerm == "" {
                /// don't do anything
            } else {
//                self.dm.filter2(valoreSearhed: self.searchTerm, arrayTosearh: self.dm.airportVector)
            }

            List(list, id: \.self) { item in
                Text(item)
//                ForEach(dm.appoggio) { valore in
//                    Text(valore.aptICAO)
//                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...