You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:24:02