часто мне нужно перенести данные из представления Swiftui в соответствующую ViewModel, позволяя ViewModel вычислять строки, значения и т. Д., Для отображения в представлении. Я пытаюсь найти архитектурный подход, который согласуется с философией Swiftui при минимизации кода шаблона. P> Лучшее решение, которое я представлял, включает следующие шаги: < /p>
передача данных с помощью инициализатора: < /strong> я передаю соответствующую Свойство (например, структура или примитивное значение) для представления в качестве параметра в его инициализаторе. @state < /code> переменная в представлении. OnAppear , чтобы установить начальные данные в ViewModel. >
< /ul>
< /li>
< /ol>
Забота: < /strong> < /h3>
< P> Хотя этот подход работает, я подозреваю, что использование .onpear и .onchange для этой цели может быть не идеальным. Я чувствую, что мне не хватает более элегантного или идиоматического решения. Ниже я передаю простое значение counter , но в реальном приложении это обычно будет более сложной структурой (например, сектор полета или результат расчета). Это представляет собой решение, которое я использую сейчас. В синхронизации с данными, передаваемыми из представления, избегая необходимости полагаться на .onapear и .onchange ? Как я могу достичь этого более быстрым способом при минимизации шаблона? < /P>
struct ContentView: View {
@State private var counter = 1
init() {
print("ContentView: initializing")
}
var body: some View {
let _ = print("ContentView: evaluating body declaration")
NavigationStack {
VStack {
Text("Local counter value: \(counter)")
SecondView(counter: counter)
Button("Increment") {
counter += 1
}
}
}
}
}
struct SecondView: View {
var counter: Int
@State private var viewModel = SecondViewModel()
var body: some View {
let _ = print("SecondView: updating body property")
Group {
Text("Second View: counter is \(counter)")
Text(viewModel.counterString)
}
.onAppear {
viewModel.counter = counter
}
.onChange(of: counter) { _, newValue in
viewModel.counter = newValue
}
}
}
@Observable
class SecondViewModel {
var counter = 0
var counterString: String {
"SecondView ViewModel: counter is \(counter)"
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... -while-mai
Как лучше всего перенести данные из представления Swiftui в его ViewModel, сохраняя при этом синхронизацию и избегая кот ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение