繁体   English   中英

为什么 didSet 在 SwiftUI 中使用 Binding 属性无法按预期工作

[英]Why is didSet not working as expected with a Binding property in SwiftUI

我在子视图中有以下两个属性:

  1. 是初始化为 false 的本地 @State var localValue
  2. 是由父视图切换的 @Binding var parentValue 属性。

我想在我的代码中使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM