[英]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.