如何使用 SwiftUI 在不同视图之间共享自定义类型的数组?

问题描述 投票:0回答:0

我正在尝试为不同的相机创建一个数据库。我使用了一个结构来创建一个类型,该类型具有一些不同的变量,例如 Make、Model、Shutter Speed、crop factor ext..(尽管我已经删除了大部分以使代码更小)

我想在着陆页的列表中显示摄像头的名称,并有一张表将摄像头添加到数组中,这是我计划存储摄像头信息的地方。我一辈子都想不出如何创建一个环境对象(或类似的东西),它是一个自定义类型的数组,可以在多个不同的视图上编辑和查看。

很明显,我对编码很陌生,很难找到任何我可以轻松遵循的解决方案。也许我遗漏了一些非常明显的东西,但我只是不知道该怎么做。是否可以创建自定义类型的共享数组,或者我是不是做错了?

包括列表视图的着陆页。

import SwiftUI

struct ContentView: View {
    
    //starts with the AddCameraView not being shown
    @State private var showingSheet = false
    
    @State public var cameraArray = [CameraStruct]()
    
    var body: some View {
        VStack{
            List{
                //for each camera in the array join the manufactuerer and model to create a name and dispaly it in the list
                ForEach (cameraArray, id: \.id) { camera in
                    Text("\(camera.camManufacturer)" + " " + "\(camera.camModel)")
                }
            }
        }
        .navigationTitle("Cameras")
        .toolbar{
            Button{
                showingSheet.toggle()
            } label: {
                Label("Add Camera", systemImage: "plus")
            }
            .sheet(isPresented: $showingSheet) {
                AddCameraView()
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

带有自定义表单的工作表。

import SwiftUI

struct AddCameraView: View {
    
    //allows the sheet to close when told
    @Environment(\.dismiss) var dismiss
    
    @State public var cameraArray = [CameraStruct]()
    
    
    //starts with the form being empty
    @State private var camManufacturerInput = ""
    @State private var camModelInput = ""
    
    var body: some View {
        NavigationView{
            VStack{
                //creates the form for information
                Form{
                    Section(header: Text ("General Info")) {
                        TextField("Camera Manufacturer", text: $camManufacturerInput)
                        TextField("Camera Model", text: $camModelInput)
                    }
                }
            }
            .navigationTitle("Add Camera Details")
            .toolbar{
                ToolbarItemGroup(placement: .navigationBarTrailing) {
                    Button("Save"){
                        //creates a variable using the new type camera struct
                        var camera = CameraStruct(id: UUID(), camManufacturer: camManufacturerInput, camModel: camModelInput)
                        
                        //adds the camera to the first position in the array
                        self.cameraArray.insert(camera, at: 0)
                        dismiss()
                    }
                    //all text fields must be filled filled in to save
                    .disabled(camManufacturerInput.isEmpty || camModelInput.isEmpty)
                }
            }
        }
    }
}
struct AddCameraView_Previews: PreviewProvider {
    static var previews: some View {
        AddCameraView()
    }
}

我正在使用的自定义结构

import Foundation

struct CameraStruct: Identifiable, Codable {
    var id: UUID
    var camManufacturer: String
    var camModel: String
}

我已经学习了大量的在线教程,包括 StateObjects 和 EnvironmentObjects,但似乎并没有离我想去的地方更近一步。通常这会导致创建一个新类,其中已有值,而我想从一个完全空白的应用程序开始构建。

arrays swiftui swift5 environment
© www.soinside.com 2019 - 2024. All rights reserved.