繁体   English   中英

如何从其他视图更改 @State 变量

[英]How can I change an @State Variable from an other View

我尝试使用此代码更改 @State 变量(来自另一个结构,而不是我声明变量的结构):

MyExampleStruct().myVariable = "New Value"

但它没有用。 我不知道如何改变它们的价值,有人知道吗? 谢谢布托什

您不会像这样直接操作视图的@State 但是,根据您的用例,您可以使用许多选项来获得类似的结果。

选项 1:绑定

当您需要从父级和子级操作变量时使用:

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())"
            }
        }
    }
}

选项 2:ObservableObject

当 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)
    }
}

选项 3:无 state

当只有父级需要操作值时使用:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM