有人可以幫我解決這個問題。每當我試圖將 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]()
}
uj5u.com熱心網友回復:
要使用UserSettingsObservableObject,您需要在呼叫Calculation視圖之前宣告它。將它傳遞給 Calculationusing.environmentObject(userSettings)以便它在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]()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/443577.html
