如何从父函数运行子函数?

2024-03-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”等。因此,按钮运行的函数应该从最后一个子级引用。

更新: 最后我写了this https://stackoverflow.com/questions/70119454/binding-void-in-contentview-previews/解决方案。

更新: 我收到反馈,要求我澄清。没问题。我希望它能帮助别人。:)

澄清: 我没有附上完整的代码,只是使用了一个简单的示例。但我在实现树状生成菜单时需要这个:当菜单中的每个项目有或没有其子项时。按下父对象用户进入子对象。在这里,我需要能够从子对象返回到父对象,但从父对象调用此解雇函数。为此,我使用了以下代码并将此函数引用到每个父对象:

@Environment(\.presentationMode) var presentationMode
 presentationMode.wrappedValue.dismiss()

您可以为 ChildView 创建一个对象。

struct ChildView: View {
 
    func childFunction() {
        print("I am the child")
    }
    
    var body: some View {
        Text("I am the child")
    }
}

struct ContentView: View {
    
    let childView = ChildView()
    
    var body: some View {
        childView
        Button(action: {
            childView.childFunction()
        }, label: {
            Text("Button")
        })
    }
}


EDIT:对于列表,您可以使用模型的数组并通过索引调用目标函数。

这是简单的子父示例。

struct ChildView: View {
    var text: String
    
    func childFunction() {
        print("This view is \(text)")
    }
    
    var body: some View {
        Text("I am the child")
    }
}



struct ContentView55: View {
    
    @State private var arrData = [Model(title: "Child1", destination: ChildView(text: "Child1")),
                                           Model(title: "Child2", destination: ChildView(text: "Child2")),
                                           Model(title: "Child3", destination: ChildView(text: "Child3"))]
    
    var body: some View {
        
        VStack {
            Button(action: {
                arrData[1].destination.childFunction()
            }, label: {
                Text("Button")
            })
            
            NavigationView {
                SwiftUI.List(arrData) {
                    NavigationLink($0.title, destination: $0.destination)
                }
            }
        }
    }
    
}
struct Model: Identifiable {
    var id = UUID()
    var title: String
    var destination: ChildView
}

注意:您需要为调用子函数的行建立索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从父函数运行子函数? 的相关文章

随机推荐

  • 有没有办法在 Azure Static Web App 中查看文件?

    有没有办法使用Azure Portal查看上传到Azure Static Web App的文件 我需要检查一些项目 我可以在 DevOps Repo 中看到该文件 但想确认它位于 Azure Static Web App 中的正确文件夹结构
  • 如何将参数发送到前置过滤器?

    我想在我的应用程序控制器中创建一个 before filter 方法 如下所示 def check role role name unless logged in user has role role name flash notice A
  • 伪造 HTTP 请求响应以在 Android 中进行测试

    我正在编写一个 Android 应用程序 有时需要通过 HTTP 从 REST API 请求数据 我正在使用 Apache DefaultHttpClient 来执行请求 有没有办法为此应用程序编写测试并在运行测试时 替换 DefaultH
  • 迭代前默认选择 Angular 设置下拉选择选项

    我有一个选择下拉菜单 并从列表中迭代选项 我试图设置为选定的单独选项 作为默认值 以防用户未选择值 以下是我尝试实现的方法
  • 在 XCode 中找不到应用程序证明功能

    根据 App Check Firebase 文档 据说可以将 App Attest 功能添加到您的应用程序中 但是 我在 XCode 中找不到任何此类功能 对此有什么见解吗 注意 我们已在配置文件中启用功能 文档链接 https fireb
  • 当通过开发工具查看时,Selenium WebDriver 无法找到页面源中不存在但 HTML 中存在的元素

    我正在使用 Selenium Web Driver HtmlUnitDriver 来搜索网页上的元素 我只能搜索页面源中可见的那些元素 不过 我可以使用 Internet Explorer 开发人员工具 F12 查看这些元素的详细信息 当我
  • 无法为字符串生成正则表达式

    我有一根绳子abc 123 243 xyz 432 567 我想生成一个与特定字符串匹配的正则表达式 应根据以下示例和具体结果来测试正则表达式 Exp 1 abc 123 234 xyz 432 567 123存在于 123 243 结果
  • 使用 jQuery 隐藏本机工具提示

    当用户将鼠标悬停在具有标题属性的锚标记上时 是否有办法隐藏本机工具提示操作 我不想删除它 只是不显示默认工具提示操作的令人讨厌的黄色框 UPDATE 在阅读了其他几篇文章后 我认为我无法隐藏本机工具提示操作的标题属性 但我试图跳出框框思考
  • UITextField 不会成为FirstResponder

    我在让文本字段接受成为FirstResponder 指令时遇到问题 我提供了一种自定义机制来在导航栏中创建标题 我有另一个视图控制器成功地使用了相同的技术 在 viewDidAppear 上我触发 void addTitleTextFiel
  • 如何使用 Python Popen 执行多个参数?

    我正在尝试制作一个带有按钮的 PyGtk Gui 当用户按下这个按钮时 gnome terminal提示用户写入密码 然后它会克隆这个Git 存储库 https github com pererinha gedit snippet jque
  • 从 pandas 数据框中提取字典值

    我需要从 json 文件导入的数据集中添加额外的功能 它看起来是这样的 f1 pd read json https raw githubusercontent com ansymo msr2013 bug dataset master da
  • 在 Material Angular 中显示一个简单的警报对话框

    我正在使用材质角度 来自角材料 https material angular io 该网站中的示例似乎有点过于复杂 互联网上的所有其他教程似乎要么已经过时 要么正在使用 AngularJS 如何显示一个带有标题 消息和确认 取消按钮的简单警
  • 如何使webpack 5.x src路径是项目真正的src路径而不是webpack配置文件根路径

    我在配置中配置 webpack src 路径 如下所示 path resolve dirname src 看来webpack没有找到真正的项目src路径 源路径是 web pack 配置路径 现在我得到这样的路径 Users xiaoqia
  • Go代码可以在windows中生成dll或者C++/C#可以调用golang代码吗?

    Go函数可以被调用吗C or C windows 上的代码 Go支持在Windows中生成dll吗 不 Go 代码是静态链接的 其原因在于 Go 的运行时 它嵌入在每个可执行文件中 Edit 显然 通过大量间接的方式是可能的 但在实践中远未
  • 在 Python 中,如何在列表中包含单个反斜杠元素?

    首先 我在 Windows 10 上运行 Python 3 6 python 中的反斜杠字符是一个特殊字符 充当字符串的 转义符 因此 无法直接打印 如果我想打印一个反斜杠 这样做是行不通的 print error message 解决这个
  • 电报机器人 - 保留问题和答案

    我的电报机器人是一个对话框 它需要保留问题和答案 如 TriviaBot 执行此操作的最佳 最有效 方法是什么 以用户 ID 作为键的数据库 有很多电报机器人 但是哪里有带有源代码的示例来获取想法 您的问题与 telegram bot AP
  • 将 vim 的强大功能融入 WM:模态窗口管理? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我是 Vim 的忠实粉丝 并且在很大程度上坚持极其高效的模式编辑风格 在使用 Vim 一些经验之后 我决定使用其他分享其高效 快速键盘使用理念的软件
  • Chartjs 气泡图中的各个气泡可以有标签吗?

    我正在使用 Chartjs 创建气泡图 我能够创建描述每个气泡的工具提示 但我的图表的用户可能无法将鼠标悬停在其上以查看工具提示 BubbleData 对象格式不包含标签元素 无论如何我都放了一个 不走运 我尝试过图表数据对象的 标签 元素
  • 从 AJAX 调用异步 Servlet

    我想要完成的事情并不太复杂 但由于我不太熟悉 AJAX 所以遇到了一些麻烦 实现后 我将拥有一个 JSP 其中有一个调用异步 Servlet 的按钮 servlet 将运行一个长时间运行的任务 并在部分任务完成时通过向表中添加行来向用户提供
  • 如何从父函数运行子函数?

    我想通过按父视图中的按钮来调用 childFunction demo ChildView import SwiftUI struct ChildView View func childFunction print I am the chil