仅当搜索栏文本不为空时,如何运行过滤器功能?
Posted
技术标签:
【中文标题】仅当搜索栏文本不为空时,如何运行过滤器功能?【英文标题】:How can I run the filter function only when the searchbar text is not empty? 【发布时间】:2020-01-06 14:18:41 【问题描述】:我在 SwiftUi 视图中有一个搜索按钮和一个搜索栏。 当用户在搜索栏中输入时,我尝试运行函数 filter()。
如果我使用按钮触发它起作用的动作,但我想在用户在栏中输入时触发动作。
我尝试过 if else 但给我一个警告。
无法推断通用参数“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)
``
【问题讨论】:
【参考方案1】:您的问题不是您的 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)
//
【讨论】:
【参考方案2】:您可以使用自定义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)
)
【讨论】:
以上是关于仅当搜索栏文本不为空时,如何运行过滤器功能?的主要内容,如果未能解决你的问题,请参考以下文章