Как создать панель пользовательского поиска в SwiftUI

#swift #swiftui #swiftui-environment

#swift #swiftui #swiftui-environment

Вопрос:

Я пытаюсь создать свою собственную версию UISearchBar SwiftUI для целей обучения.

Я следовал этому руководству

и на данный момент моя структура панели поиска выглядит следующим образом:

 import Foundation
import SwiftUI
    
struct SearchBarUI: View {
  
  @Binding var searchText:String
  var textColor:Color
  var boxColor:Color
  var boxHeight:CGFloat
      
  public init(_ text:Binding<String>, textColor:Color, boxColor:Color, boxHeight:CGFloat) {
    self._searchText = text
    self.textColor = textColor
    self.boxColor = boxColor
    self.boxHeight = boxHeight
  }
  
  var body: some View {
    HStack {
      Image(systemName: "magnifyingglass")
        .padding(.leading, -10)
        .foregroundColor(.secondary)
      TextField("Search", text: $searchText, onCommit:  {
        UIApplication.shared.windows.first { $0.isKeyWindow }?.endEditing(true)
      })
      .padding(.leading, 10)
      Button(action: {
        self.searchText = ""
      }) {
        Image(systemName: "xmark.circle.fill")
          .foregroundColor(.secondary)
          .opacity(searchText == "" ? 0 : 1)
          .animation(.linear)
      }
    }.padding(.horizontal)
  }
}
  

Но вот в чем проблема.

Когда я использую эту панель поиска в contentView, я хочу, чтобы текстовая переменная поиска была такой:

 class GlobalVariables: ObservableObject {
  @Published var searchText:String = ""
}

@EnvironmentObject var globalVariables : GlobalVariables

SearchBarUI(globalVariables.searchText,
            textColor:.black,
            boxColor:.gray,
            boxHeight:50)
  

поскольку значение текста поиска должно распространяться на другие элементы интерфейса, которые будут реагировать на изменение.

Но затем у меня появляется эта ошибка в SearchBarUI строке, указывающая на globalVariables.searchText :

 Cannot convert value of type 'String' to expected argument type 'Binding<String>'
  

Как мне это решить?

Комментарии:

1. Вам нужна привязка, но сначала какая globalVariables и что throttleModel в ней?

2. извините, опечатка. Я исправил.

Ответ №1:

Вот как передать привязку для наблюдаемого объекта, опубликованного свойства

 @EnvironmentObject var globalVariables : GlobalVariables

// ... other code

SearchBarUI($globalVariables.searchText,     // << here !!
  

Комментарии:

1. Ради всего святого. очевидно! Я новичок в SwiftUI, и мой мозг не может ее охватить. Спасибо