![](/img/trans.png)
[英]How can I use the @Environment(\.calendar) in a View to initialize a @State variable?
[英]How can I change an @State Variable from an other View
我尝试使用此代码更改 @State 变量(来自另一个结构,而不是我声明变量的结构):
MyExampleStruct().myVariable = "New Value"
但它没有用。 我不知道如何改变它们的价值,有人知道吗? 谢谢布托什
您不会像这样直接操作视图的@State
。 但是,根据您的用例,您可以使用许多选项来获得类似的结果。
当您需要从父级和子级操作变量时使用:
struct ParentView : View {
@State var myVariable : String = "Test"
var body: some View {
VStack {
MyExampleStruct(myVariable: $myVariable)
Button("Change") {
myVariable = "\(Date())"
}
}
}
}
struct MyExampleStruct : View {
@Binding var myVariable : String
var body : some View {
VStack {
Text(myVariable)
Button("Change") {
myVariable = "\(Date())"
}
}
}
}
当 state 需要在多个位置进行操作时使用,通过属性或通过envronmentObject
作为参考传递( https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-视图之间的数据)
class StateManager : ObservableObject {
@Published var myVariable : String = "Test"
}
struct ParentView : View {
@StateObject var state = StateManager() //use @ObservedObject if targeting iOS 13 or macOS 10.15
var body: some View {
VStack {
MyExampleStruct(state: state)
Button("Change") {
state.myVariable = "\(Date())"
}
}
}
}
struct MyExampleStruct : View {
@ObservedObject var state : StateManager
var body : some View {
Text(state.myVariable)
}
}
当只有父级需要操作值时使用:
struct ParentView : View {
@State var myVariable : String = "Test"
var body: some View {
VStack {
MyExampleStruct(myVariable: myVariable)
Button("Change") {
myVariable = "\(Date())"
}
}
}
}
struct MyExampleStruct : View {
var myVariable : String
var body : some View {
Text(myVariable)
}
}
您需要将其作为Binding
传递给另一个视图。
例如
struct SubView: View
{
@Binding var myVariable: String
init(_ s: Binding<String>) {
self._myVariable = s
}
var body: some View {
Text(myVariable).onTapGuesture { myVariable = "New Value" }
}
}
struct ContentView: View
{
@State myVariable: String = "Some String"
var body {
SubView($myVariable)
}
}
当然,这个具体的例子很蹩脚,因为您几乎不需要子视图来更改Text
字符串,但是您可以想象如果您有多个使用myVariable
的视图,其中一个可以更改值,而其他可以响应它. 这不是在任何情况下实现这一目标的唯一方法,甚至不是最好的方法。 有时你会想要一个ObservableObject
或一个@EnvironmentObject
,或者使用 SwiftUI 2, @StateObject
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.