View 将参数传递给视图的SwiftUI并不总是可用的

View 将参数传递给视图的SwiftUI并不总是可用的,view,arguments,swiftui,View,Arguments,Swiftui,调用SwiftUI时,我无法将参数传递给视图。我有这个看法 import SwiftUI struct GoodsItemFilterView: View { @Environment(\.presentationMode) var presentationMode @State var ref1Array: [String] = [] @State var ref2Array: [String] = [] @State var ref3Array: [Str

调用SwiftUI时,我无法将参数传递给视图。我有这个看法

import SwiftUI

struct GoodsItemFilterView: View {
    @Environment(\.presentationMode) var presentationMode

    @State var ref1Array: [String] = []
    @State var ref2Array: [String] = []
    @State var ref3Array: [String] = []

    @State var stockStatusArray: [String] = []
    @State var zoneArray: [String] = []

    @State var selectorRef1 = 0
    @State var selectorRef2 = 0
    @State var selectorRef3 = 0
    @State var selectorStockStatus = 0
    @State var selectorZone = 0

    var body: some View {
        NavigationView {
            Form{
                Section(header: Text("Zone"), content: {
                    Picker(selection: $selectorZone, label:
                    Text("Zone")) {
                        ForEach(0 ..< zoneArray.count, id:\.self) {
                            Text(self.zoneArray[$0])
                        }
                    }
                })

                Section(header: Text("References"), content: {
                    Picker(selection: $selectorRef1, label:
                    Text("Reference 1")) {
                        ForEach(0 ..< ref1Array.count, id:\.self) {
                            Text(self.ref1Array[$0])
                        }
                    }

                    Picker(selection: $selectorRef2, label:
                    Text("Reference 2")) {
                        ForEach(0 ..< ref2Array.count, id:\.self) {
                            Text(self.ref2Array[$0])
                        }
                    }

                    Picker(selection: $selectorRef3, label:
                    Text("Reference 3")) {
                        ForEach(0 ..< ref3Array.count, id:\.self) {
                            Text(self.ref3Array[$0])
                        }
                    }
                })

                Section(header: Text("Status"), content: {
                    Picker(selection: $selectorStockStatus, label:
                    Text("Condition")) {
                        ForEach(0 ..< stockStatusArray.count, id:\.self) {
                            Text(self.stockStatusArray[$0])
                        }
                    }
                })

                Button(action: {
                    self.selectorZone = 0
                    self.selectorRef1 = 0
                    self.selectorRef2 = 0
                    self.selectorRef3 = 0
                    self.selectorStockStatus = 0
                }, label: {
                    HStack(){
                        Spacer()
                        Image(systemName: "return")
                        Text("Reset filters")
                        Spacer()
                    }

                })

            }.navigationBarTitle("Filter")
                .navigationBarItems(leading: (
                    Button(action: {
                        self.presentationMode.wrappedValue.dismiss()
                    }, label: {
                        Text("Cancel")
                    }
                    )
                    ), trailing: (
                        Button(action: {

                            self.presentationMode.wrappedValue.dismiss()
                        }, label: {
                            Text("Done")
                        }
                        )
                ))
        }.onAppear{
            self.ref1Array.insert("***ALL***", at: 0)
            self.ref2Array.insert("***ALL***", at: 0)
            self.ref3Array.insert("***ALL***", at: 0)

            self.stockStatusArray.insert("***ALL***", at: 0)
            self.zoneArray.insert("***ALL***", at: 0)


        }
    }
}

struct GoodsItemFilter_Previews: PreviewProvider {
    static var previews: some View {
        GoodsItemFilterView(ref1Array: ["MAX100", "MAX101", "MAX102"], ref2Array: ["REF2_100", "REF2_101"], ref3Array: ["REF3_100", "REF3_101"])
    }
}

现在我有了另一个观点,它基本上是这个观点的一个副本,有一些改变了的名字等等

//
//  OrderHeaderFilter.swift
//  WMS Toolbox
//
//  Created by Max on 2020-01-24.
//  Copyright © 2020 Max. All rights reserved.
//

import SwiftUI
//import Combine

struct OrderHeaderFilterView: View {
    @Environment(\.presentationMode) var presentationMode

    @State var orderTypeArray: [String] = []
    @State var carrierArray: [String] = []

    @State var fromStatus2 = UserDefaults.standard.string(forKey: "view.orderHeaderFilter.fromStatus")
    //  @State private var fromStatus2 = "040"

    @State private var direction = ""
    @State private var fromStatus = ""
    @State private var toStatus = ""
    @State private var orderType = ""


    @State var selectorOrderType = 0
    @State var selectorCarrier = 0

    @State private var selectorIndex = 1
    @State private var fromStatusSelectorIndex = 6
    @State private var toStatusSelectorIndex = 2

    @State private var directions = ["Inbound","Outbound","Both"]

    private var orderStatusFromArray: [String] = ["005", "010", "022", "025", "030", "035", "040", "045", "046", "047", "060"]
    private var orderStatusToArray: [String] = ["005", "010", "022", "025", "030", "035", "040", "045", "046", "047", "060"]

    @State var orderStatus = OrderStatus.s05

    enum OrderStatus: String, CaseIterable, Identifiable {
        case s05 = "005"
        case s10 = "010"
        case s22 = "022"
        case s25 = "025"
        case s30 = "030"
        case s35 = "035"
        case s40 = "040"
        case s45 = "045"
        case s46 = "046"
        case s60 = "060"

        var id: String { rawValue }
    }




    enum Direction: String, CaseIterable{
        case outbound = "1"
        case inbound = "2"
        case both = "3"

        init(type: String) {
            switch type {
            case "1": self = .outbound
            case "2": self = .inbound
            case "3": self = .both
            default: self = .both
            }
        }

        var text: String {
            switch self {
            case .outbound: return "Outbound"
            case .inbound: return "Inbound"
            case .both: return "Both"
            }
        }
    }

    init(){
        //nothing here
    }

    var body: some View {

        return NavigationView{
            Form{
                HStack{
                    Text("Direction")
                    Spacer()
                    Picker(selection: $direction, label:
                    Text("Direction")) {
                        ForEach(directions, id:\.self) {
                            status in
                            Text(status)
                        }
                    }
                    .pickerStyle(SegmentedPickerStyle())
                }

                Picker(selection: $fromStatus, label:
                Text("From Status")) {
                    ForEach(orderStatusFromArray, id:\.self) {
                        status in
                        Text(status)
                    }
                }

                Picker(selection: $toStatus, label:
                Text("To Status")) {
                    ForEach(orderStatusFromArray, id:\.self) {
                        status in
                        Text(status)
                    }
                }

            }.navigationBarTitle("Filter")
                .navigationBarItems(leading: (
                    Button(action: {
                        self.presentationMode.wrappedValue.dismiss()
                    }, label: {
                        Text("Cancel")
                    }
                    )
                    ), trailing: (
                        Button(action: {


                            self.presentationMode.wrappedValue.dismiss()
                        }, label: {
                            Text("Done")
                        }
                        )
                ))

        }.onAppear{

            self.direction = UserDefaults.standard.string(forKey: "view.orderHeaderFilter.direction")!
            self.fromStatus = UserDefaults.standard.string(forKey: "view.orderHeaderFilter.fromStatus")!
            self.toStatus = UserDefaults.standard.string(forKey: "view.orderHeaderFilter.toStatus")!

            self.orderTypeArray.insert("***ALL***", at: 0)
            self.carrierArray.insert("***ALL***", at: 0)



        }
    }
}

struct OrderHeaderFilter_Previews: PreviewProvider {
    static var previews: some View {
        OrderHeaderFilterView()
    }
}
当我调用它时,它不会提示我将数组作为参数传递:

GoodsItemFilterView(ref1Array: ["MAX100", "MAX101", "MAX102"], ref2Array: ["REF2_100", "REF2_101"], ref3Array: ["REF3_100", "REF3_101"])  
OrderHeaderFilterView()  

这两种观点有什么区别,一种是关于初始化的,另一种不是?要明确的是,最后我想传递参数,因此GoodsItemFilterView()正是我所需要的。

环境对象不是通过init方法传递的,而是隐式注入的。orderTypeArray和carrierArray已具有初始值。因此OrderHeaderFilterView()不会提示您输入参数。

发现问题:

我在代码里有这一段

init(){
        //nothing here
    }
这需要删除,否则它不会要求任何变量

另一个问题是我不理解的:

private var orderStatusFromArray: [String] = ["005", "010", "022", "025", "030", "035", "040", "045", "046", "047", "060"]
    private var orderStatusToArray: [String] = ["005", "010", "022", "025", "030", "035", "040", "045", "046", "047", "060"]
如果我将var更改为let,它将按预期工作。另一种选择是在开始时删除私有文件。看来只要你有一个

private var ...

在代码中,所有参数都是私有的。也许我在这里遗漏了一些东西,但这对我来说似乎是一个bug。

区别在于OrderHeaderFilterView()在运行应用程序时会崩溃。致命错误:未找到SettingStore类型的ObservableObject…..请不要将
@State
用作参数(在这种情况下,它将无法正常工作),因为它仅用于内部视图。为了方便起见,将其设置为私有。应用程序不会因为OrderHeaderFilterView()而崩溃,因为这显然不是整个项目。数组必须是@State,因为在下面的onAppear()中,我向它们添加了一个元素。我已经更新了原始帖子以显示完整的代码。您是正确的,应用程序不会因为OrderHeaderFilterView()而崩溃。我很快就添加了一条评论,并为此付出了错误的代价。但是ref1Array、ref2Array、ref3Array也已经初始化,它仍然提供我将它们作为参数传递。