SwiftUI如何从父视图调用子视图函数,含递归嵌套场景实现需求
问题描述
我希望点击父视图中的按钮时,调用示例ChildView中的childFunction()方法。
初始代码如下:
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() } }
这个示例可能不够完善,我实际需要实现的效果是:用户访问对应子视图后,点击父视图的按钮会运行当前子视图的对应函数。
比如初始状态下用户点击按钮打印This view is Parent,用户进入Child1页面后点击按钮应该打印This view is Child1,以此类推,按钮运行的函数需要绑定最后访问的子视图的对应方法。
实现背景与最终方案思路
我没有贴出完整代码,仅用简单示例演示需求。我是在实现树状生成菜单时需要该功能:菜单中的每个项可能有子项,用户点击父对象进入子对象后,我需要能够从父对象调用dismiss函数从子对象返回父对象。我最终采用的方案是将返回函数引用到每个父对象,核心代码如下:
@Environment(\.presentationMode) var presentationMode presentationMode.wrappedValue.dismiss()
内容的提问来源于stack exchange,提问作者Degtiarev Aleksei
相关产品推荐
相关产品推荐

