如何从父级运行子函数?
Posted
技术标签:
【中文标题】如何从父级运行子函数?【英文标题】:How to run child function from parent? 【发布时间】: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()
【问题讨论】:
目前还不清楚你要做什么,但我怀疑你正在尝试做一些你不应该做的事情。视图不应包含程序代码。您可能应该操纵一个影响视图的模型 【参考方案1】:您可以为 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
注意:您需要为该行建立索引才能调用子函数。
【讨论】:
嗨。感谢你的回答。有用。但是在递归视图结构的情况下,当 ContentView 具有通过 NavigationLinks 创建的 ContentView 子对象时,如何解决这个问题,因为值类型不能具有递归包含它的存储属性? @DegtiarevAleksei 你能在你的问题中添加一个例子吗? 更新问题 @DegtiarevAleksei 我已经添加了编辑部分。这可能会有所帮助。 谢谢你的回答,但是我编译后按钮总是返回“This view is Child2”以上是关于如何从父级运行子函数?的主要内容,如果未能解决你的问题,请参考以下文章
typescript @ViewChild - 从父级访问CHILD COMPONENT。当您要在子组件中触发函数时,这非常有用。
在 useEffect() 钩子中从父级传递的子级调用函数,React