【问题标题】:How can I run the filter function only when the searchbar text is not empty?仅当搜索栏文本不为空时,如何运行过滤器功能?
【发布时间】:2023-04-03 05:01:02
【问题描述】:

我在 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)
                }
            }
        }
    }
}
``

【问题讨论】:

    标签: arrays swift if-statement vector swiftui


    【解决方案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)
                  }
              )
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-24
        • 1970-01-01
        • 2012-05-05
        • 2019-12-21
        • 1970-01-01
        • 2020-08-17
        • 2019-09-12
        • 1970-01-01
        相关资源
        最近更新 更多