SwiftUI 回调作为视图的参数

Pan*_*nos 2 ios swift swiftui

我试图将我的 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") }
    }
}

Run Code Online (Sandbox Code Playgroud)

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

Asp*_*eri 8

下面的变体作品。使用 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") }
    }
}
Run Code Online (Sandbox Code Playgroud)