SwiftUI - 按钮 - 如何将函数请求传递给父级

Posted

技术标签:

【中文标题】SwiftUI - 按钮 - 如何将函数请求传递给父级【英文标题】:SwiftUI - Button - How to pass a function request to parent 【发布时间】:2020-01-22 13:48:38 【问题描述】:

如何让按钮执行触发其“父”视图中的功能的操作?我正在尝试重构我的代码,以使组件尽可能小。

在这种情况下,按钮执行一些任务,但其中之一是运行一个函数:

Button(
 action: 
  self.setViewBackToNil()
 )
  Text("Button")


// which triggers a function
func setViewBackToNil()
 self.userData.image = nil
 self.isProcessing = false
 .... etc

现在,如果我把按钮变成它自己的视图,我不能传递 self.setViewBackToNil 因为它包含在父级的结构中。

有没有办法让组件在其父级中触发函数?

【问题讨论】:

除非您将该功能传递给您的子组件,否则我认为没有。 (例如作为闭包) 【参考方案1】:

这是一个关于如何将闭包传递给子视图然后调用父函数的小示例:

struct ChildView: View 
    var function: () -> Void
    
    var body: some View 
        Button(action: 
            self.function()
        , label: 
            Text("Button")
        )
    


struct ParentView: View 
    var body: some View 
        ChildView(function:  self.fuctionCalledInPassedClosure() )
    
    
    func fuctionCalledInPassedClosure() 
        print("I am the parent")
    


我希望这会有所帮助!

编辑附加信息

下面是一个传递函数的例子:

struct ChildView: View 
    var function: () -> Void
    
    var body: some View 
        Button(action: 
            self.function()
        , label: 
            Text("Button")
        )
    


struct ParentView: View 
    var body: some View 
        ChildView(function: self.passedFunction)
    
    
    func passedFunction() 
        print("I am the parent")
    

【讨论】:

如何使var function: () -> Void 成为可选项? 我相信是这样的:var function: (() -> Void)? ChildView 的 PreviewProvider 缺少 function 参数。我该如何解决? 也许添加如下内容:struct ChildView_Preview: PreviewProvider static var previews: some View ChildView() 好的,我刚刚通过将 ChildView() 替换为 ChildView(function: ) 来修复它

以上是关于SwiftUI - 按钮 - 如何将函数请求传递给父级的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 如何将数据传递给 ObservedObject 函数

如何使用 SwiftUI 将参数传递给 Button 的操作

如何通过切换 Swiftui 传递函数

如何正确地将单击按钮属性值传递给表单提交事件?

如何将通用视图传递给 SwiftUI 中的结构

如何使用 SwiftUI 将变量传递给 MFMailComposeViewController()?