簡體   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