我在SwiftUi View中有一个搜索按钮和一个搜索栏。 当用户在搜索栏中键入时,我尝试运行函数 filter((。
如果我使用该按钮来触发操作,它可以工作,但我想在用户在栏中键入时触发操作。
我已经尝试过,但给我一个警告。
无法推断通用参数"虚假内容" 1. 调用函数 'buildBoth(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)
}
}
}
}
}
``
你的问题不是你的if/else,因为这有效:
如您所见,if/else 在那里,没有编译器警告...... Tipp:尝试注释掉所有语句,然后通过取消注释进行迭代,并检查编译器何时警告您 ->然后您有错误
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)
// }
}
}
}
}
可以使用自定义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)
}
)
}
}