【问题标题】:SwiftUI - Button - How to pass a function request to parentSwiftUI - 按钮 - 如何将函数请求传递给父级
【发布时间】: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 因为它包含在父级的结构中。

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

【问题讨论】:

  • 除非您将该功能传递给您的子组件,否则我认为没有。 (例如作为闭包)

标签: button swiftui


【解决方案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: {}) 来修复它
猜你喜欢
  • 2021-05-09
  • 2017-04-25
  • 2019-12-04
  • 1970-01-01
  • 2020-07-21
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多