【发布时间】:2021-11-24 05:44:05
【问题描述】:
我想通过在父视图中按下按钮来调用 childFunction() demo ChildView。
import SwiftUI
struct ChildView: View {
func childFunction() {
print("I am the child")
}
var body: some View {
Text("I am the child")
}
}
struct ContentView: View {
var function: (() -> Void)?
var body: some View {
ChildView()
Button(action: {
self.function!()
}, label: {
Text("Button")
})
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
更新: 谢谢@RajaKishan,它可以工作,但我需要它也可以递归地工作
import SwiftUI
struct ContentView: View {
@State var text: String = "Parent"
var isNavigationViewAvailable = true
func function() {
print("This view is \(text)")
}
var body: some View {
VStack {
if isNavigationViewAvailable {
Button(action: {
function()
}, label: {
Text("Button")
})
}
if isNavigationViewAvailable {
NavigationView {
List {
NavigationLink("Child1") {
ContentView(text: "Child1", isNavigationViewAvailable: false)
}
NavigationLink("Child2") {
ContentView(text: "Child2", isNavigationViewAvailable: false)
}
NavigationLink("Child3") {
ContentView(text: "Child3", isNavigationViewAvailable: false)
}
}
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
也许不是最好看的例子,但问题是,如何在用户访问相应的孩子后强制按钮运行它的孩子的功能。
就像,当用户按下按钮开始时,它会打印“这个视图是父视图”。用户来到 child1 后,按下按钮应打印“This view is Child1”,依此类推。所以,button运行的函数应该是从最后一个child引用的。
更新: 最后我写了this解决方案。
更新: 我收到反馈,要求我澄清。没问题。我希望它会帮助别人。:)
澄清: 我没有附上整个代码,只是使用了一个简单的例子。但是我在实现树状生成菜单时需要这个:当菜单中的每个项目有或没有它的子项时。按下父对象用户进入子对象。在这里,我需要能够从子对象返回到父对象,但是从父对象调用这个解除函数。为此,我使用了以下代码并将此函数引用到每个父对象:
@Environment(\.presentationMode) var presentationMode
presentationMode.wrappedValue.dismiss()
【问题讨论】:
-
目前还不清楚你要做什么,但我怀疑你正在尝试做一些你不应该做的事情。视图不应包含程序代码。您可能应该操纵一个影响视图的模型