创建环境对象
creating an Environment object
有人可以帮我解决这个问题吗?每当我尝试将 gp 声明为环境对象时,该列表就会消失。当 gp 是 @State 变量时,该列表工作正常。你能帮我创建一个全局变量 gp 以便它在 Final 的另一个屏幕上工作吗?我想在最终屏幕中调用 gp,以便我可以使用 gp 的值来计算其他内容。
import SwiftUI
struct Calculation: View {
@State var load1 = Float()
@State var load2 = Float()
//@State var gp : Float = 0
@State var rate: Float = 0
@ObservedObject var taskStore = TaskStore()
@EnvironmentObject var userSettings: UserSettings
func addNewToDo() {
taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: " Earning: = \(rate.description)", amount: rate))
}
var body: some View {
NavigationView {
VStack {
List {
Section(header:Text("load 2"))
{
TextField("Enter value of load 1", value: $load1, format: .number)
TextField("Enter value of load 1", value: $load2, format: .number)
}
HStack {
Button(String(format: "Add Load"), action: {
print("pay for the shift is ")
print(Rocky(mypay: rate))
userSettings.gp += rate
})
Button(action: {
addNewToDo()
Rocky(mypay: rate)
},
label: {
Text(" ")
})
}
ForEach(self.taskStore.tasks) { task in
Text(task.toDoItem)
}
.onMove(perform : self.move)
.onDelete(perform : self.delete) //For each
}
.navigationBarTitle("SHIFTS")
.navigationBarItems(trailing: EditButton()) //List
Text("Gross Pay = $\(userSettings.gp) ")
NavigationLink(destination: Final(), label: {Text("Next")})
}.onAppear()
}
}
func Rocky(mypay: Float)
{
rate = load1 + load2
print("Sus \(userSettings.gp)")
}
func move(from source : IndexSet, to destination : Int)
{
taskStore.tasks.move(fromOffsets: source, toOffset: destination)
}
func delete(at offsets : IndexSet) {
if let index = offsets.first { //<-- Here
let task = taskStore.tasks[index]
userSettings.gp -= task.amount
}
taskStore.tasks.remove(atOffsets: offsets)
}
}
struct Final: View {
@EnvironmentObject var userSettings: UserSettings
var body: some View {
Text("Final result \(userSettings.gp)")
}
}
文件的另一部分如下:
import Foundation
import SwiftUI
import Combine
class UserSettings: ObservableObject
{
@Published var gp : Float = 0
}
struct Task : Identifiable {
var id = String()
var toDoItem = String()
var amount : Float = 0 //<-- Here
}
class TaskStore : ObservableObject {
@Published var tasks = [Task]()
}
要使用您的 UserSettings
ObservableObject,您需要在调用 Calculation
视图之前声明它。
使用 .environmentObject(userSettings)
将其传递给 Calculation
,以便它在 Calculation
中可用
和所有“子视图”(如 Final
),例如在这个示例代码中:
struct ContentView: View {
@StateObject var userSettings = UserSettings() // <-- here
var body: some View {
Calculation().environmentObject(userSettings) // <-- here
}
}
EDIT-1:这是我使用的完整测试代码:
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject var userSettings = UserSettings() // <-- here
var body: some View {
Calculation().environmentObject(userSettings) // <-- here
}
}
struct Calculation: View {
@State var load1 = Float()
@State var load2 = Float()
@State var rate: Float = 0
@StateObject var taskStore = TaskStore() // <-- here
@EnvironmentObject var userSettings: UserSettings
func addNewToDo() {
taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: " Earning: = \(rate.description)", amount: rate))
}
var body: some View {
NavigationView {
VStack {
List {
Section(header:Text("load 2")){
TextField("Enter value of load 1", value: $load1, format: .number)
TextField("Enter value of load 1", value: $load2, format: .number)
}
HStack {
Button(String(format: "Add Load"), action: {
print("pay for the shift is ")
print(Rocky(mypay: rate))
userSettings.gp += rate
})
Button(action: {
addNewToDo()
Rocky(mypay: rate)
},
label: {
Text(" ")
})
}
ForEach(self.taskStore.tasks) { task in
Text(task.toDoItem)
}
.onMove(perform : self.move)
.onDelete(perform : self.delete) //For each
}
.navigationBarTitle("SHIFTS")
.navigationBarItems(trailing: EditButton()) //List
Text("Gross Pay = $\(userSettings.gp) ")
NavigationLink(destination: Final(), label: {Text("Next")})
}.onAppear()
}
}
func Rocky(mypay: Float){
rate = load1 + load2
print("Sus \(userSettings.gp)")
}
func move(from source : IndexSet, to destination : Int){
taskStore.tasks.move(fromOffsets: source, toOffset: destination)
}
func delete(at offsets : IndexSet) {
if let index = offsets.first { //<-- Here
let task = taskStore.tasks[index]
userSettings.gp -= task.amount
}
taskStore.tasks.remove(atOffsets: offsets)
}
}
struct Final: View {
@EnvironmentObject var userSettings: UserSettings
var body: some View {
Text("Final result \(userSettings.gp)")
}
}
class UserSettings: ObservableObject {
@Published var gp : Float = 0
}
struct Task : Identifiable {
var id = String()
var toDoItem = String()
var amount : Float = 0 //<-- Here
}
class TaskStore : ObservableObject {
@Published var tasks = [Task]()
}
有人可以帮我解决这个问题吗?每当我尝试将 gp 声明为环境对象时,该列表就会消失。当 gp 是 @State 变量时,该列表工作正常。你能帮我创建一个全局变量 gp 以便它在 Final 的另一个屏幕上工作吗?我想在最终屏幕中调用 gp,以便我可以使用 gp 的值来计算其他内容。
import SwiftUI
struct Calculation: View {
@State var load1 = Float()
@State var load2 = Float()
//@State var gp : Float = 0
@State var rate: Float = 0
@ObservedObject var taskStore = TaskStore()
@EnvironmentObject var userSettings: UserSettings
func addNewToDo() {
taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: " Earning: = \(rate.description)", amount: rate))
}
var body: some View {
NavigationView {
VStack {
List {
Section(header:Text("load 2"))
{
TextField("Enter value of load 1", value: $load1, format: .number)
TextField("Enter value of load 1", value: $load2, format: .number)
}
HStack {
Button(String(format: "Add Load"), action: {
print("pay for the shift is ")
print(Rocky(mypay: rate))
userSettings.gp += rate
})
Button(action: {
addNewToDo()
Rocky(mypay: rate)
},
label: {
Text(" ")
})
}
ForEach(self.taskStore.tasks) { task in
Text(task.toDoItem)
}
.onMove(perform : self.move)
.onDelete(perform : self.delete) //For each
}
.navigationBarTitle("SHIFTS")
.navigationBarItems(trailing: EditButton()) //List
Text("Gross Pay = $\(userSettings.gp) ")
NavigationLink(destination: Final(), label: {Text("Next")})
}.onAppear()
}
}
func Rocky(mypay: Float)
{
rate = load1 + load2
print("Sus \(userSettings.gp)")
}
func move(from source : IndexSet, to destination : Int)
{
taskStore.tasks.move(fromOffsets: source, toOffset: destination)
}
func delete(at offsets : IndexSet) {
if let index = offsets.first { //<-- Here
let task = taskStore.tasks[index]
userSettings.gp -= task.amount
}
taskStore.tasks.remove(atOffsets: offsets)
}
}
struct Final: View {
@EnvironmentObject var userSettings: UserSettings
var body: some View {
Text("Final result \(userSettings.gp)")
}
}
文件的另一部分如下:
import Foundation
import SwiftUI
import Combine
class UserSettings: ObservableObject
{
@Published var gp : Float = 0
}
struct Task : Identifiable {
var id = String()
var toDoItem = String()
var amount : Float = 0 //<-- Here
}
class TaskStore : ObservableObject {
@Published var tasks = [Task]()
}
要使用您的 UserSettings
ObservableObject,您需要在调用 Calculation
视图之前声明它。
使用 .environmentObject(userSettings)
将其传递给 Calculation
,以便它在 Calculation
中可用
和所有“子视图”(如 Final
),例如在这个示例代码中:
struct ContentView: View {
@StateObject var userSettings = UserSettings() // <-- here
var body: some View {
Calculation().environmentObject(userSettings) // <-- here
}
}
EDIT-1:这是我使用的完整测试代码:
import SwiftUI
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@StateObject var userSettings = UserSettings() // <-- here
var body: some View {
Calculation().environmentObject(userSettings) // <-- here
}
}
struct Calculation: View {
@State var load1 = Float()
@State var load2 = Float()
@State var rate: Float = 0
@StateObject var taskStore = TaskStore() // <-- here
@EnvironmentObject var userSettings: UserSettings
func addNewToDo() {
taskStore.tasks.append(Task(id: String(taskStore.tasks.count + 1), toDoItem: " Earning: = \(rate.description)", amount: rate))
}
var body: some View {
NavigationView {
VStack {
List {
Section(header:Text("load 2")){
TextField("Enter value of load 1", value: $load1, format: .number)
TextField("Enter value of load 1", value: $load2, format: .number)
}
HStack {
Button(String(format: "Add Load"), action: {
print("pay for the shift is ")
print(Rocky(mypay: rate))
userSettings.gp += rate
})
Button(action: {
addNewToDo()
Rocky(mypay: rate)
},
label: {
Text(" ")
})
}
ForEach(self.taskStore.tasks) { task in
Text(task.toDoItem)
}
.onMove(perform : self.move)
.onDelete(perform : self.delete) //For each
}
.navigationBarTitle("SHIFTS")
.navigationBarItems(trailing: EditButton()) //List
Text("Gross Pay = $\(userSettings.gp) ")
NavigationLink(destination: Final(), label: {Text("Next")})
}.onAppear()
}
}
func Rocky(mypay: Float){
rate = load1 + load2
print("Sus \(userSettings.gp)")
}
func move(from source : IndexSet, to destination : Int){
taskStore.tasks.move(fromOffsets: source, toOffset: destination)
}
func delete(at offsets : IndexSet) {
if let index = offsets.first { //<-- Here
let task = taskStore.tasks[index]
userSettings.gp -= task.amount
}
taskStore.tasks.remove(atOffsets: offsets)
}
}
struct Final: View {
@EnvironmentObject var userSettings: UserSettings
var body: some View {
Text("Final result \(userSettings.gp)")
}
}
class UserSettings: ObservableObject {
@Published var gp : Float = 0
}
struct Task : Identifiable {
var id = String()
var toDoItem = String()
var amount : Float = 0 //<-- Here
}
class TaskStore : ObservableObject {
@Published var tasks = [Task]()
}