从SwiftUI中子级的子级调用父级函数

从SwiftUI中子级的子级调用父级函数,swiftui,Swiftui,我有一个ParentView,它将一个函数传递给一个ChildView,然后在ChildView中单击一个按钮时在ParentView中调用该函数。 但是如果我想让孩子的孩子调用这个函数呢?我是否需要进一步向下传递函数,或者是否有一种方法可以使函数在整个环境中以某种方式访问 struct ParentView: View { func parentFunction() { print("parentFunction called") } var body

我有一个ParentView,它将一个函数传递给一个ChildView,然后在ChildView中单击一个按钮时在ParentView中调用该函数。 但是如果我想让孩子的孩子调用这个函数呢?我是否需要进一步向下传递函数,或者是否有一种方法可以使函数在整个环境中以某种方式访问

struct ParentView: View {
    func parentFunction() {
        print("parentFunction called")
    }

    var body: some View {
        ChildView(p: parentFunction)
    }
}


struct ChildView: View {
    var p: () -> ()
    var body: some View {
        VStack {
            Text("child view")
            Button(action: {
                self.p()
            }) {
                Image(systemName: "person")
            }
        }
    }
}

是的,可以使用自定义的EnvironmentKey,然后使用“设置父视图环境”功能,该功能将可用于所有子视图

下面是该方法的演示

struct ParentFunctionKey: EnvironmentKey {
    static let defaultValue: (() -> Void)? = nil
}

extension EnvironmentValues {
    var parentFunction: (() -> Void)? {
        get { self[ParentFunctionKey.self] }
        set { self[ParentFunctionKey.self] = newValue }
    }
}

struct ParentView: View {
    func parentFunction() {
        print("parentFunction called")
    }

    var body: some View {
        VStack {
            ChildView()
        }
        .environment(\.parentFunction, parentFunction) // set in parent
    }
}

struct ChildView: View {
    @Environment(\.parentFunction) var parentFunction // join in child
    var body: some View {
        VStack {
            Text("child view")
            Button(action: {
                self.parentFunction?() // < use in child
            }) {
                Image(systemName: "person")
            }
            Divider()
            SubChildView()
        }
    }
}

struct SubChildView: View {
    @Environment(\.parentFunction) var parentFunction // join in next subchild
    var body: some View {
        VStack {
            Text("Subchild view")
            Button(action: {
                self.parentFunction?() // use in next subchild
            }) {
                Image(systemName: "person.2")
            }
        }
    }
}

就是这样,它不工作了,我的父函数没有被调用。我按照前面提到的步骤操作,但没有工作