我正在尝试从 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)")
}
}
}