为什么不从父视图调用子视图的方法更新子视图?

时间:2020-08-08 22:40:23

标签: swift swiftui

我正在尝试调用子视图的方法,其中包括清除其某些字段。从父视图调用该方法时,什么也不会发生。但是,从子视图中调用该方法将清除其字段。这是一些示例代码:

isEmpty

有人可以告诉我为什么会发生这种情况以及如何解决/解决它吗?我无法直接访问子视图的get,因为实际代码中的字段太多,这会使它过于混乱。

2 个答案:

答案 0 :(得分:0)

尝试使用@Binding代替@State。绑定是一种将状态变化传达给孩子的方法。

这样考虑:@State变量用于查看特定状态。因此,通常将它们制成private。如果您需要传达任何信息,那么@Binding是做到这一点的方法。

struct ChildView: View {
    @Binding var response: String

    var body: some View {
        TextField("", text: $response)
    }

}

struct ParentView: View {
    @State private var response = ""

    var body: some View {
        HStack {
            ChildView(response: $response)
            Button(action: {
                self.clear()
            }) {
                Text("Clear")
            }
        }
    }

    private func clear() {
        self.response = ""
    }
}

答案 1 :(得分:0)

SwiftUI视图不是引用类型,您不能创建一次,不能将其存储在var中,然后再访问它-SwiftUI视图是一种结构,值类型,因此像存储它一样使用它来存储值,即< / p>

struct ParentView: View {
    private var child = ChildView()     // << original value
    
    var body: some View {
        HStack {
            self.child                  // created copy 1
            Button(action: {
                self.child.clear()      // created copy 2
            }) {

这是构造父/子视图的正确SwiftUI方法-有关子视图的所有信息都应在子视图内部或通过init参数注入到其中:

struct ChildView: View {
    @State private var response = ""
    
    var body: some View {
        HStack {
            TextField("", text: $response)
            Button(action: {
                self.clear()
            }) {
                Text("Clear")
            }
        }
    }
    
    func clear() {
        self.response = ""
    }
}

struct ParentView: View {
    var body: some View {
        ChildView()
    }
}