当涉及协调器时,如何在SwiftUI视图之间进行通信?

时间:2020-09-17 16:43:09

标签: swift swiftui

我是SwiftUI的新手。仅仅几天尝试学习。 我试图找到有关此的教程,但没有成功。

想象一下我有以下观点:

Struct MyPicker: View {

MyPickerVStack内部的ContentView内部。 我必须将三个参数从MyPicker传递到ContentViewcolorwidthtype

问题在于这些值来自MyPicker内部的委托回调。所以我必须在MyPicker内部有一位协调员。

struct MyPickerHelper: UIViewRepresentable {
  class Coordinator:NSObject, MyPickerDelegate {
    var color:UIColor
    var width:CGFloat
    var type:PKInkingTool.InkType 

    func toolPickerSelectedToolDidChange(_ toolPicker: PKToolPicker) {
      if toolPicker.selectedTool is PKInkingTool {
        let tool = toolPicker.selectedTool as! PKInkingTool
        self.color = tool.color
        self.width = tool.width
        self.type = tool.inkType
      }
    }

那里有很多东西,例如@Binding@Published@State等。我该在哪里放置MyPicker来传达对ContentView的更改?

1 个答案:

答案 0 :(得分:2)

您需要在父视图中将状态作为真​​理的来源,并将对它的绑定传递到可表示的视图中,这是一个参数的示例...

struct MyPicker: View {
   @State private var color: UIColor = .clear   // << source

   var body: some View {
      MyPickerHelper(color: $color)     // << pass binding
   }
}

现在可以表示

struct MyPickerHelper: UIViewRepresentable {
  @Binding var color: UIColor

  func makeCoordinator() -> Coordinator {
     Coordinator(owner: self)
  }

  ...

  class Coordinator:NSObject, MyPickerDelegate {
    private var owner: MyPickerHelper

    init(owner: MyPickerHelper) {
      self.owner = owner
    }

    func toolPickerSelectedToolDidChange(_ toolPicker: PKToolPicker) {
      if toolPicker.selectedTool is PKInkingTool {
        let tool = toolPicker.selectedTool as! PKInkingTool

        self.owner.color = tool.color         // << here update via binding !!!
      }
    }

   ...
}