Следующий минимальный код переключает отображение подробностей нажатием кнопки.
struct ContentView: View {
@State var showDetails: Bool = false
var body: some View {
VStack {
DetailsButton(showDetails: $showDetails) // 1
if showDetails {
Text("This is my message!")
}
}
}
}
struct DetailsButton: View {
@Binding var showDetails: Bool
var body: some View {
Button("\(showDetails ? "Hide" : "Show") Details") {
showDetails.toggle()
}
}
}
Я хотел бы добиться того же, но переместив свойство showDetails
в ViewModel, которое я передаю как переменную среды:
(Обратите внимание, что я использую новую платформу наблюдения Swift 5.9 и iOS 17/macOS 14.)
@Observable class ViewModel {
var showDetails: Bool
}
Обычно я бы инициализировал его в классе App:
struct TestApp: App {
@State var vm = ViewModel()
var body: some Scene {
WindowGroup {
ContentView()
.environment(vm)
}
}
}
и передать ViewModel в ContentView в качестве переменной среды:
@Environment(ViewModel.self) private var vm
Как в этом сценарии передать привязку vm.showDetails
от ContentView
к DetailsButton
, как я это сделал в исходном примере? (Смотрите строку с пометкой «1»)
Чтобы использовать vm.showDetails
в DetailsButton
, попробуйте этот подход:
используя @Bindable
import SwiftUI
import Observation
@main
struct TestApp: App {
@State private var vm = ViewModel()
var body: some Scene {
WindowGroup {
ContentView()
.environment(vm)
}
}
}
@Observable class ViewModel {
var showDetails: Bool = false // <--- here
}
struct ContentView: View {
@Environment(ViewModel.self) var vm
var body: some View {
@Bindable var vm = vm // <--- here
VStack {
DetailsButton(showDetails: $vm.showDetails)
if vm.showDetails { // <--- here
Text("This is my message!")
}
}
}
}
struct DetailsButton: View {
@Binding var showDetails: Bool
var body: some View {
Button("\(showDetails ? "Hide" : "Show") Details") {
showDetails.toggle()
}
}
}
Дополнительную информацию можно найти @Bindable
на странице Данные модели (внизу страницы). Если мой ответ помог, примите его, отметив галочку рядом с ним.
Спасибо!! Я не знала о
Bindable
. Кажется, именно для этого он и предназначен. Я попробую это в своем более сложном случае, чтобы увидеть, есть ли какие-либо препятствия, но я предполагаю, что это решит проблему !! 🇺🇦💪🇺🇦