Как лучше всего перенести данные из представления Swiftui в его ViewModel, сохраняя при этом синхронизацию и избегая котIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как лучше всего перенести данные из представления Swiftui в его ViewModel, сохраняя при этом синхронизацию и избегая кот

Сообщение Anonymous »

часто мне нужно перенести данные из представления 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»