gpt4 book ai didi

swiftui - 在 SwiftUI 中从 child 的 child 调用 parent 的功能

转载 作者:行者123 更新时间:2023-12-05 02:09:14 25 4
gpt4 key购买 nike

我有一个将函数传递给 ChildView 的 ParentView,然后当在 ChildView 中单击一个按钮时在 ParentView 中调用该函数。但是,如果我想要一个 Child of the Child 来调用该函数怎么办?我是否需要进一步向下传递该函数,或者有没有办法让某个函数以某种方式在整个环境中都可以访问?

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,然后使用它设置父 View 环境功能,这将可用于所有 subview 。

这是一个方法演示

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

关于swiftui - 在 SwiftUI 中从 child 的 child 调用 parent 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60146921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com