gpt4 book ai didi

mvvm - 在没有持久性的情况下将数据保存在 SwiftUI MVVM 层次结构中

转载 作者:行者123 更新时间:2023-12-05 04:42:51 25 4
gpt4 key购买 nike

我是 SwiftUI 的新手,来自 Java。我了解 MVC 模式并尝试了解 SwiftUI 中的 MVVM。它很好地工作,但我不知道如何在 View 层次结构之间保存数据......而且 View 不应该对模型一无所知,所以我尝试使用 ViewModels 传递 View 。每个 ViewModel 都应该管理他们的模型。

第一个问题:这是像我一样在 SwiftUI 中实现 MVVM 的好方法吗?第二:这里有人可以帮助我严格区分模型和 View 并让这段代码正常工作吗?

现在我可以添加一个 Garage,进入 GarageView 并添加某些 Car 模型。切换回 GarageListView 并添加另一个 Garage 模型后,第一个 Garage 模型中的所有 Car 模型都消失了......我究竟做错了什么? ;(

import SwiftUI

// Models
struct Car: Identifiable, Codable {
var id = UUID()
var name: String
}

struct Garage: Identifiable, Codable {
var id = UUID()
var name: String
var cars: [Car] = []
}

// ViewModels
class GarageListViewModel: ObservableObject {
@Published var garages: [Garage] = []
}

class GarageViewModel: ObservableObject {
@Published var garage: Garage

init(garage: Garage) {
self.garage = garage
}
}

class CarViewModel: ObservableObject {
@Published var car: Car

init(car: Car) {
self.car = car
}
}

// Views
struct GarageListView: View {
@ObservedObject var viewModel: GarageListViewModel

var body: some View {
List {
ForEach(viewModel.garages) { garage in
NavigationLink {
GarageView(viewModel: GarageViewModel(garage: garage))
} label: {
Text(garage.name)
}
}
}
.toolbar {
Button {
viewModel.garages.append(Garage(name: "My Garage"))
} label: {
Label("Add", systemImage: "plus")
}
}
}
}

struct GarageView: View {
@ObservedObject var viewModel: GarageViewModel

var body: some View {
List {
ForEach(viewModel.garage.cars) { car in
NavigationLink {
CarDetailView(viewModel: CarViewModel(car: car))
} label: {
Text(car.name)
}
}
}
.toolbar {
Button {
viewModel.garage.cars.append(Car(name: "My Car"))
} label: {
Label("Add", systemImage: "plus")
}
}
}
}

struct CarDetailView: View {
@ObservedObject var viewModel: CarViewModel

var body: some View {
Text(viewModel.car.name)
}

}

struct ContentView: View {
@StateObject var viewModel = GarageListViewModel()

var body: some View {
NavigationView {
GarageListView(viewModel: viewModel)
}
}
}

最佳答案

我会从使用 struct 切换到 class。结构是按值传递的,所以你永远不会得到完全相同的结构,而是它的一个副本。通过添加新的 GarageViewModel,SwiftUI 将重新呈现列表,这就是为什么在添加新车库时会丢失车库的汽车。

附带说明,您还忘记在 GarageListViewGarageView 中的列表周围添加 NavigationView,呈现 NavigationLink没用。

关于mvvm - 在没有持久性的情况下将数据保存在 SwiftUI MVVM 层次结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69767425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com