仅当搜索栏文本不为空时,如何运行过滤器功能?

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)
            
        )
    

【讨论】:

以上是关于仅当搜索栏文本不为空时,如何运行过滤器功能?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:仅当输入不为空时才启用保存按钮

仅当字段不为空时才进行电子邮件验证

仅当搜索框不为空时才显示项目匹配内容

在 Java8 中使用 lambda 仅在不为空时过滤值

仅当 Mono 为空时如何执行操作,如果不为空则抛出错误

仅当文本字段为空时如何显示图像?