![](/img/trans.png)
[英]Why is didSet called twice on the TextField binding in SwiftUI?
[英]Why is didSet not working as expected with a Binding property in SwiftUI
我在子视图中有以下两个属性:
我想在我的代码中使用 localValue,因为它以 false 开始,然后在视图初始化时切换为 true,这将启动一个需要以 false 开始的动画。 parentValue 属性在父视图中被切换,我希望它更新我的 localValue 属性以正确控制动画。 尽管 parentValue 确实在切换 localValue 属性,但似乎没有随 didSet 改变。 我错过了什么???
@State var localValue = false
@Binding var parentValue: Bool {
didSet {localValue = parentValue}
}
根据评论更新更多细节
如果没有办法做到这一点,因为@Binding 包装器本身没有改变所以 didSet 没有被触发,那么我需要的是类似的。
我想要一个最初设置为 false 但可以从外部视图切换的属性,以便控制子视图中的动画,该动画根据被切换的值改变方向。
如果我可以将子视图中的绑定属性初始化为 false 即是否有某种方法可以设置
@Binding var breath: Bool = false
作为起始值,每次父视图切换 parentValue 属性时,子视图都会正确响应。 现在父视图调用子视图并将此属性设置为 true,这意味着动画已完全展开,而我希望第一步让动画在特定持续时间内增长,然后在父视图将值设置为 false 时反转对于其他一些持续时间。
// Whole flower
.rotationEffect(.degrees(breath ? 360 : 0), anchor: .center) // Inhale = clockwise rotation, Exhale = anticlockwise rotation
.scaleEffect(breath ? 1 : 0.2) // Inhale = upscale, Exhale = downscale
.animation( Animation.easeInOut(duration: self.stepDuration))
.opacity(breath ? 1 : 0.75)
请参阅上面的代码,了解为什么当视图开始时动画的比例因子为 0.2,但在持续时间到期且呼吸属性已切换为 false 时在反转之前增长到全尺寸很重要。
didSet
没有被调用的原因是因为属性的值没有改变。 您必须为基础_parentValue
属性分配一个新的Binding
。 相反,您可以定义一个新的Binding
属性来改变parentValue
属性并调用自定义闭包。 一个简单的方法是定义一个扩展方法,如下所示:
extension Binding {
func didSet(_ closure: @escaping (Value) -> ()) -> Binding<Value> {
Binding(
get: { self.wrappedValue },
set: {
self.wrappedValue = $0
closure($0)
}
)
}
}
然后当您初始化您的财产时,您可以执行以下操作:
self.parentValue = $someBinding.didSet { localValue = $0 }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.