如何使用 SwiftUI 在 Apple Watch Digital Crown 的 @State 变量更改上触发函数?
How to fire a function on @State variable change from Apple Watch Digital Crown with SwiftUI?
下面的代码在旋转 Digital Crown 时在 SwiftUI 中创建了一个圆环。我想在 "crownValue" 状态变量达到值 5.0 时触发一个函数,也就是圆完全可见时。
我怎样才能有一个函数来响应 crown 值的变化以执行网络请求?
谢谢
struct commandDetailView: View {
@State var crownValue = 0.1
var body: some View {
VStack {
Circle()
.trim(from: 0.0, to: CGFloat(crownValue / 5.0))
.stroke(Color.blue, style: StrokeStyle(lineWidth: 12, lineCap: CGLineCap.round, lineJoin: .round))
.frame(width: 120, height: 120)
Text("Spin to Start Car")
}
.focusable(true)
.digitalCrownRotation($crownValue, from: 0.1, through: 5.0, sensitivity: .low, isContinuous: false, isHapticFeedbackEnabled: true)
.onAppear() {
}
}
}
不幸的是,现在最简单的方法是使用自定义绑定来包装您的 crownValue
。 (我很遗憾地说,因为我与 Apple 有一张公开票,关于 @State
缺少 didSet
以及如何解决它,但还没有解决方案。)
var crownValueBinding: Binding<Double> {
Binding<Double>(
get: { self.crownValue },
set: { newValue in
self.crownValue = newValue
self.myFunc() // Whatever you like
}
)
}
并使用它:
SomeView()
.digitalCrownRotation(self.crownValueBinding, ...) // NOTE: No $ sign!
实际上,如果您 import Combine
,您可以执行以下操作:
[...]
.focusable(true)
.digitalCrownRotation($crownValue, from: 0.1, through: 5.0, sensitivity: .low, isContinuous: false, isHapticFeedbackEnabled: true)
.onReceive(Just(crownValue)) { output in
print(output) // Here is the answer.
}
下面的代码在旋转 Digital Crown 时在 SwiftUI 中创建了一个圆环。我想在 "crownValue" 状态变量达到值 5.0 时触发一个函数,也就是圆完全可见时。
我怎样才能有一个函数来响应 crown 值的变化以执行网络请求?
谢谢
struct commandDetailView: View {
@State var crownValue = 0.1
var body: some View {
VStack {
Circle()
.trim(from: 0.0, to: CGFloat(crownValue / 5.0))
.stroke(Color.blue, style: StrokeStyle(lineWidth: 12, lineCap: CGLineCap.round, lineJoin: .round))
.frame(width: 120, height: 120)
Text("Spin to Start Car")
}
.focusable(true)
.digitalCrownRotation($crownValue, from: 0.1, through: 5.0, sensitivity: .low, isContinuous: false, isHapticFeedbackEnabled: true)
.onAppear() {
}
}
}
不幸的是,现在最简单的方法是使用自定义绑定来包装您的 crownValue
。 (我很遗憾地说,因为我与 Apple 有一张公开票,关于 @State
缺少 didSet
以及如何解决它,但还没有解决方案。)
var crownValueBinding: Binding<Double> {
Binding<Double>(
get: { self.crownValue },
set: { newValue in
self.crownValue = newValue
self.myFunc() // Whatever you like
}
)
}
并使用它:
SomeView()
.digitalCrownRotation(self.crownValueBinding, ...) // NOTE: No $ sign!
实际上,如果您 import Combine
,您可以执行以下操作:
[...]
.focusable(true)
.digitalCrownRotation($crownValue, from: 0.1, through: 5.0, sensitivity: .low, isContinuous: false, isHapticFeedbackEnabled: true)
.onReceive(Just(crownValue)) { output in
print(output) // Here is the answer.
}