有人能帮我吗。每当我试图将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]()
}
要使用UserSettings
ObservableObject,需要在调用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]()
}