【问题标题】:SwiftUI callback as parameter to a viewSwiftUI 回调作为视图的参数
【发布时间】: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") }
    }
}

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

【问题讨论】:

    标签: ios swift swiftui


    【解决方案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/…
    猜你喜欢
    • 2022-08-19
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    相关资源
    最近更新 更多