将 onChanged 回调添加到 SwiftUI 结构以发出值



我正在尝试从 SwiftUI 组件中获取值。我不想拥有像DragGesture这样的 API(例如(。

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

如何将这样的回调函数添加到MyCustomComponent?我宁愿使用完全相同的语法。组件将连续发出值(基于组件内部的本地拖动手势(。我不想扩充的组件的代码可以在这里看到。

这是可能的方法之一(最简单的 IMO(...

struct WheelView: View {
var onEmit: (CGFloat) -> Void
init(onEmit: @escaping (CGFloat)-> Void = {_ in }) {
self.onEmit = onEmit
}
...
// TODO: Emit angle from here
self.onEmit(self.angle)
}

使用(在ViewBuilder的任何地方(

WheelView() { angle in
print("(angle)")
}

通过@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)")
}
}
}

最新更新