创建Environment对象



有人能帮我吗。每当我试图将gp声明为Environment对象时,列表就会消失。当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]()
}

要使用UserSettingsObservableObject,需要在调用Calculation视图之前声明它。使用.environmentObject(userSettings)将其传递给Calculation,以便在Calculation中可用并且所有";子视图";(类似于Final(,例如在本示例中的代码:

struct ContentView: View {
@StateObject var userSettings = UserSettings()   // <-- here

var body: some View {
Calculation().environmentObject(userSettings)  // <-- here
}
}

编辑-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]()
}

最新更新