View 将参数传递给视图的SwiftUI并不总是可用的
调用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
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也已经初始化,它仍然提供我将它们作为参数传递。