Как связать переменную среды ios17

С новым@Observableмакрос, представленный для iOS 17, теперь мы можем использовать объекты среды следующим образом

      @Environment(MyType.self) var myTypeObj

Сейчас еслиmyTypeObjимеет какое-то имущество, назовите егоmyPropertyкоторый я хотел бы передать как привязку где-нибудь, используя$синтаксиса, Swift жалуется, что не может найти переменную. Например,

      Picker("My Picker", selection: $myTypeObj.myProperty) { // we get an error on this line
  ForEach(1 ... 50, id: \.self) { num in
    ...
  }
}

мы получаем сообщение об ошибкеCannot find $myTypeObj in scope. Это ошибка Swift или я делаю что-то не так?

2 ответа

В iOS 17 вам нужно использовать Bindable.

      @Observable
class AppState {
    var isOn: Bool = false
}

struct ContentView: View {
    
    @Environment(AppState.self) private var appState
    
    var body: some View {
        
        @Bindable var bindable = appState
        
        VStack {
            Toggle("Is On", isOn: $bindable.isOn)
        }
        .padding()
    }
}

#Preview {
    ContentView()
        .environment(AppState())
}

Для себя и других я также думаю, что Азамшарп в своем видео введите описание ссылки, упомянутое здесь, чтобы привязка работала, нам нужно использовать отдельное представление для привязки. Но здесь мы видим, что есть и другой путь:

  1. @Environment(AppState.self) частная переменная appState
  2. @Bindable varbindable = appState, но самое главное : этот @Bindable помещается в «представление тела».
Другие вопросы по тегам