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

dot*_*ot3 14 button swiftui

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

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

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

// which triggers a function
func setViewBackToNil(){
 self.userData.image = nil
 self.isProcessing = false
 .... etc
}
Run Code Online (Sandbox Code Playgroud)

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

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

krj*_*rjw 53

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

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")
    }
}

Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!

编辑附加信息

这是传递函数的示例:

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信这样:`var function: (() -> Void)?` (2认同)