SwiftUI 回调作为视图的参数

Posted

技术标签:

【中文标题】SwiftUI 回调作为视图的参数【英文标题】:SwiftUI callback as parameter to a view 【发布时间】:2020-03-28 16:34:28 【问题描述】:

我正在尝试将我的 SwiftUI 视图拆分为尽可能小的可重用组件。所以我有位于顶部的 MainView,然后是两个视图(MyContentView 和 MenuView),它们都位于 MainView 中。两个内部视图都有一些我想在 MainView 中更新的功能。所以我想我可以将一些函数作为参数从 MainView 传递给内部视图,所以当在内部视图中按下按钮时,它会触发 MainView 中的代码。我设法接近它的最接近的方法是在每次更新内部视图时触发函数参数。实现这一目标的最佳方法是什么?这是我的代码示例:

主视图:

struct MainView: View 
    var body: some View 
         VStack 
             MyContentView(self.$doSomething)
             MenuView(self.$doSomething)
         
    

    func doSomething() 
        print("do something")
    


struct MyContentView : View 
    var doSomething : ()
    var body: some View 
        Button(action:  self.doSomething )  Text("do something") 
    


struct MenuView : View 
    var doSomething : ()
    var body: some View 
        Button(action:  self.doSomething )  Text("Menu do something") 
    


能够从内部视图接收回调的最佳做法是什么?

【问题讨论】:

【参考方案1】:

以下变体有效。使用 Xcode 11.4 测试。

struct MainView: View 
    var body: some View 
         VStack 
             MyContentView(doSomething: self.doSomething)
             MenuView(doSomething: self.doSomething)
         
    

    func doSomething() 
        print("do something")
    


struct MyContentView : View 
    var doSomething : () -> ()
    var body: some View 
        Button(action:  self.doSomething() )  Text("do something") 
    


struct MenuView : View 
    var doSomething : () -> ()
    var body: some View 
        Button(action:  self.doSomething() )  Text("Menu do something") 
    

【讨论】:

你是个传奇...我尝试了各种组合,但看起来我错过了这个。我没有像您在 MainView 上那样尝试传递参数。非常感谢:) 是的,他是;)他也经常帮助我;) 方法中如何传递参数? @YogendraPatel 有关将参数传递给闭包的示例,请参阅medium.com/swiftcommmunity/…

以上是关于SwiftUI 回调作为视图的参数的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 从回调中分配一个值,显示在视图中

SwiftUI PickerView 与工作回调如何?

将数据从 SwiftUI 传递到 UIKit 的回调

SwiftUI:从嵌套视图调用方法

SwiftUI,不能从委托回调中更改状态? (附代码)

作为 UITextView inputAccessoryView 的 SwiftUI 视图具有不正确的框架