在下面的代码中,变量“ 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())
首先,滑块正在更新变量slidetwo
,其初始值为560000
。
打开第二个视图时,将结构的值存储到变量string
中,将始终具有由yourVariable
定义的值,因此移动滑块完全不会影响第二个视图。
为了正确地执行此操作,如果希望在第二个视图内更改变量并在Binding
或简单的未初始化的ContentView
中反映这些更改,则可以使用[C0
使用第二个选项将导致用@State var
替换SecondView
var string = MyVariables.yourVariable
中的>]
然后在工作表内的@State var string: String
中调用ContentView
而不是SecondView(string: String(slidetwo))
我不知道为什么在这里需要一个结构。它所做的只是保留默认值,仅此而已