Прошло несколько недель и бесконечное количество исследований, чтобы понять, как управлять несколькими вложенными массивами, но, в конце концов, мне пришлось спросить себя.
У меня есть три модели, которые соответствуют трем представлениям :
- Супермаркет : это основной массив, состоящий из разных областей. Список супермаркетов показан в ContentView ;
- Площадь : это второй массив, который вложен в каждый перечисленный супермаркет и состоит из разных продуктов. Список областей показан в DetailSupermarketView , который связан с ContentView;
- Product : это третий массив, который вложен в каждую область, указанную в каждом супермаркет. Список продуктов показан в DetailAreaView , который является листом, доступным из DetailAreaView.
Мой вопрос: возможно ли ADD an * 1027? * Площадь с указанием c Супермаркет или Продукт с указанием c Площадь . Я пробовал использовать разные функции, но они обычно добавляют элемент ко всем представлениям.
Вы можете посмотреть код здесь. Я поместил кнопку в конце окна «Виды», чтобы, если хотите, вы могли написать некоторый код, чтобы помочь мне.
Модель
class Supermarket: Identifiable, Codable, Hashable, Equatable, ObservableObject {
let objectWillChange = ObservableObjectPublisher()
var id : UUID = UUID()
var name : String
var area : [Area]
init(name: String, area: [Area]) {
self.name = name
self.area = area
}
func hash(into hasher: inout Hasher) {
hasher.combine(name)
hasher.combine(area)
}
static func == (lhs: Supermarket, rhs: Supermarket) -> Bool {
return lhs.name == rhs.name
}
func updateUI() {
DispatchQueue.main.async {
self.objectWillChange.send()
}
}
enum CodingKeys: String, CodingKey {
case id
case name
case area
}
}
class Area: Identifiable, Codable, Hashable, Equatable, ObservableObject {
var id : UUID = UUID()
var name : String
var product : [Product]
init(name: String, product: [Product]) {
self.name = name
self.product = product
}
func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
static func == (lhs: Area, rhs: Area) -> Bool {
return lhs.name == rhs.name
}
}
class Product: Identifiable, Codable, Hashable, Equatable, ObservableObject {
var id : UUID = UUID()
var name: String
init(name: String) {
self.name = name
}
func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
static func == (lhs: Product, rhs: Product) -> Bool {
return lhs.name == rhs.name
}
}
Менеджер
class SuperMarket_DataManager: ObservableObject {
let objectWillChange = ObservableObjectPublisher()
var supermarkets: [Supermarket] = [] {
didSet {
objectWillChange.send() // dice all'interfaccia di aggiornarsi
}
}
init() {
let area_1 : [Area] = [Area(name: "Area A", product: [Product(name: "Product 1A"), Product(name: "Product 2A")]), Area(name: "Area B", product: [Product(name: "Product 1B"), Product(name: "Product 2B")]), Area(name: "Area C", product: [Product(name: "Product 1C"), Product(name: "Product 2C")])]
let area_2 : [Area] = [Area(name: "Area D", product: [Product(name: "Product 1D"), Product(name: "Product 2D")]), Area(name: "Area E", product: [Product(name: "Product 1E"), Product(name: "Product 2E")]), Area(name: "Area F", product: [Product(name: "Product 1F"), Product(name: "Product 2F")])]
let supermarket_1 = Supermarket(name: "Supermarket 1", area: area_1)
let supermarket_2 = Supermarket(name: "Supermarket 2", area: area_2)
supermarkets = [supermarket_1, supermarket_2]
}
}
Просмотров
struct ContentView: View {
@ObservedObject var supermarket_dm: SuperMarket_DataManager
var body: some View {
NavigationView {
VStack {
List {
ForEach(self.supermarket_dm.supermarkets, id:\.self) { markets in
NavigationLink(destination: DetailSupermercato(supermarket: markets)) {
VStack {
Text(markets.name)
}
}
}
}
}
.navigationBarTitle("Supermarkets")
}
}
}
struct DetailSuperMarketView: View {
var supermarket : Supermarket
var area : Area?
@State private var isDetailAreaOpened = false
var body: some View {
VStack {
Text(supermarket.name)
List {
ForEach(supermarket.area, id:\.self) { areas in
Button(action: {
self.isDetailAreaOpened.toggle()
}) {
Text(areas.name)
}
.sheet(isPresented: self.$isDetailAreaOpened) {
DetailAreaView(area: areas)
}
}
}
Button(action: {
debugPrint("Add area")
}) {
Text("Add area")
}
}
}
}
struct DetailAreaView: View {
var area : Area
var body: some View {
VStack {
Text(area.name)
List {
ForEach(area.product, id:\.self) { products in
Text(products.name)
}
}
Button(action: {
debugPrint("Add products")
}) {
Text("Add products")
}
}
}
}