Добавьте обратный вызов onChanged в структуру SwiftUI для передачи значений - PullRequest
1 голос
/ 11 декабря 2019

Я пытаюсь передать значения из компонента SwiftUI. Я не хочу иметь API, как DragGesture (в качестве примера).

DragGesture()
  .onChanged { value in
     print("Get access to value when it changes \(value)")
  }

Как добавить функцию обратного вызова, подобную этой, к MyCustomComponent? Я бы предпочел иметь точно такой же синтаксис. Компонент будет выдавать значения непрерывно (на основе DragGesture локально внутри компонента. Код для компонента, который я не хочу увеличивать, можно увидеть здесь .

1 Ответ

0 голосов
/ 12 декабря 2019

Нашел этот ответ @Asperi, который показывает, как это сделать, как я хотел . Хитрость заключается в том, чтобы на самом деле вернуть свою копию.

typealias OnChange = ((CGFloat) -> Void)?

struct WheelView: View {
  var action: OnChange

  func onChanged(perform action: OnChange) -> Self {
    var copy = self
    copy.action = action
    return copy
  }

  var body: some View {
    Circle()
      .gesture(DragGesture()
        .onChanged { value in
          // ? Emit the angle change
          if let action = self.action {
            action(0.4)
          }
      })
  }
}

Тогда мы можем использовать наш компонент следующим образом:

struct Usage: View {
  var body: some View {
    WheelView()
      .onChanged { value in
        print("Value is \(value)")
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...