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

2023-12-27

我是 SwiftUI 新手。才几天努力学习。 我试图找到这方面的教程,但没有成功。

想象一下我有以下观点:

Struct MyPicker: View {

MyPicker是在一个里面VStack inside ContentView。 我必须通过,从MyPicker to ContentView,3个参数:color, width and type.

问题是这些值来自内部的委托回调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?


您需要将状态作为父视图中的事实来源,并将其绑定传递到可表示视图中,这...这是一个参数的示例...

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 !!!
      }
    }

   ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当涉及协调器时,如何在 SwiftUI 视图与另一个视图之间进行通信? 的相关文章

随机推荐