如何在swiftUI中从父视图调用子视图的函数来更改@state变量?

puruo6ea  于 2023-02-18  发布在  Swift
关注(0)|答案(1)|浏览(195)

我想进入swift/swiftui,但我真的很难做到这一点:
我有一个包含ChildViewMainViewChildView有一个函数update,用于从外部源获取要显示的数据,并将其赋给@State data变量。
我希望能够从MainView触发update,以便更新data
我曾经体验过update实际上被调用,但是,data在此调用时被重置为初始值。
我所拥有的总结:

struct ChildView: View {
    
    @State var data: Int = 0

     var body: some View {
       Text("\(data)")

        Button(action: update) {
            Text("update") // works as expected 
        }
     }

    func update() {
        // fetch data from external source 
        data = 42
    }
}
struct MainView: View {
    var child = ChildView()
 
    var body: some View {
        VStack {
           child
           
           Button(action: {
              child.update()
           }) {
              Text("update")  // In fact calls the function, but doesn't set the data variable to the new value
           }
        }
    }
}

当我在谷歌上搜索解决方案时,我只遇到一些人建议将updatedata移动到MainView,然后将data的绑定传递到ChildView
然而,按照这个逻辑,我必须通过添加所有的数据访问逻辑来破坏MainView。我使用ChildView的目的是将代码分解成更小的块,并重用ChildView,包括其他父视图中的数据访问方法。我只是不能相信在SwiftUI中没有办法做到这一点。

deyfvvtc

deyfvvtc1#

一开始对如何处理SwiftUI上的状态感到困惑是完全可以理解的,但是坚持住,你很快就会找到你的方向。
根据项目的要求和限制,您可以通过许多不同的方式来实现您想要做的事情。我将提到一些选项,但我肯定还有更多选项,所有选项都有优缺点,但希望其中一个能满足您的需要。

绑定

也许最简单的方法是使用@Bindinghere是一个很好的教程/解释。
例如,在MainView上声明data,并将其作为@Binding传递给ChildView。当需要更改data时,直接在MainView上更改它,并将反映在两者上。
这种解决方案导致在两个部分都有逻辑,可能不是很理想,但可以满足您的需要。
还要注意ChildViewinitialiser现在是如何直接位于MainView的主体上的。

示例

struct ChildView: View {
    
    @Binding var data: Int

     var body: some View {
       Text("\(data)")

        Button(action: update) {
            Text("update") // works as expected 
        }
     }

    func update() {
        // fetch data from external source 
        data = 42
    }
}
struct MainView: View {
    @State var data: Int = 0
 
    var body: some View {
        VStack {
           ChildView(data: $data)
           
           Button(action: {
              data = 42
           }) {
              Text("update")  // In fact calls the function, but doesn't set the data variable to the new value
           }
        }
    }
}

可观察对象

另一种选择是从视图中删除状态和逻辑,使用ObservableObjecthere作为它的解释。

示例

一个一个二个一个一个一个三个一个一个一个一个一个四个一个

相关问题