Добавить массивы во вложенные массивы в SwiftUI - PullRequest
0 голосов
/ 17 апреля 2020

Прошло несколько недель и бесконечное количество исследований, чтобы понять, как управлять несколькими вложенными массивами, но, в конце концов, мне пришлось спросить себя.

У меня есть три модели, которые соответствуют трем представлениям :

  • Супермаркет : это основной массив, состоящий из разных областей. Список супермаркетов показан в 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")
                }
            }
    }
    }
...