如何在不同结构的Swift中正确更新变量

问题描述 投票:0回答:1

在下面的代码中,变量“ yourVariable”在结构中定义。然后,我使用滑块更改“ yourVariable”,但是当我尝试在SecondView中使用变量时,它使用的是原始变量,而不是更新的变量。有人告诉我我需要更新属性,我应该这样做吗?如果可以,请解释原因。

import SwiftUI
import PlaygroundSupport

struct MyVariables {
    static var yourVariable = 500000.0
}



struct SecondView : View {
    @Environment(\.presentationMode) var presentationMode
    var string = MyVariables.yourVariable
    var body: some View {
        VStack {Button("\(string)") {
            self.presentationMode.wrappedValue.dismiss()
            } 
        }
    }
}


struct ContentView : View {
    @State private var showingSheet = false

    @State public var step = 0
    @State public var text = ""
    @State public var slide = 20.0
    @State public var slidetwo = MyVariables.yourVariable + 60000
    var r0 : Double {
        rvalues[(wearingMaskToggle ? 1:0) + (washingHandsToggle ? 2:0) + (quarantineToggle ? 8:0) + (coverMouthToggle ? 4:0)]
    }
    @State private var rvalues = [6.5, 6.1, 5.3, 4.8, 4.2, 3.5, 3.1, 2.9, 1.75, 1.5, 1.2, 1.0, 0.92, 0.82, 0.75, 0.7]

    var body: some View {
        ZStack {
            Color.gray
                .edgesIgnoringSafeArea(.all)
                VStack {
                    HStack {
                        Button(action: {
                            if self.slidetwo > 10000{
                                self.slidetwo -= 1000 //When rand = 10050, it still works
                            }
                        }, label: {
                            Image(systemName: "minus")
                        })
                        Slider(value: $slidetwo, in: 10000...1000000, step: 1000)
                            .padding(20)
                            .accentColor(Color.green)
                        Button(action: {
                            if self.slidetwo < 1000000{
                                self.slidetwo += 1000
                            }
                        }, label: {
                            Image(systemName: "plus")
                        })
                    }.foregroundColor(Color.green) .padding(.horizontal, 100)
                }
                Text("Initial Population: \(Int(slidetwo))")

                Button("Show Sheet") {
                    self.showingSheet.toggle()
                }
                .sheet(isPresented: $showingSheet) {
                    SecondView()
                }
            }
        }
}
PlaygroundPage.current.setLiveView(ContentView())
swift swiftui swift-playground
1个回答
0
投票

首先,滑块正在更新变量slidetwo,其初始值为560000

打开第二个视图时,将结构的值存储到变量string中,将始终具有由yourVariable定义的值,因此移动滑块完全不会影响第二个视图。

为了正确地执行此操作,如果希望在第二个视图内更改变量并在Binding或简单的未初始化的ContentView中反映这些更改,则可以使用[C0

使用第二个选项将导致用@State var替换SecondView var string = MyVariables.yourVariable中的>]

然后在工作表内的@State var string: String中调用ContentView而不是SecondView(string: String(slidetwo))

我不知道为什么在这里需要一个结构。它所做的只是保留默认值,仅此而已

© www.soinside.com 2019 - 2024. All rights reserved.