[英]SwiftUI avoid repeated onChange call
在我的代碼中,“最終”切換的值基於視圖模型中的復雜邏輯。 例如,用戶打開開關,但如果不滿足某些條件,邏輯可以將其關閉(此處簡化為數字比較)。 問題:在用戶打開開關后, onChange
被觸發,如果邏輯發現它應該被關閉, onChange
將再次被觸發,因為有更改(這次不是由用戶做出的)。
例如,如果生成的隨機數為 5,則控制台打印以下語句(8 來自第二次調用):
on change called shouldUseToggle called 5 on change called shouldUseToggle called 8 onChange(of: Bool) action tried to update multiple times per frame.
我想避免它並使onChange
僅對用戶的更改做出反應,而不是來自視圖模型的更改。 有沒有辦法做到這一點 ? 或者也許有其他方法來解決它?
import SwiftUI
struct ContentView: View {
@StateObject var myViewModel = MyViewModel()
var body: some View {
VStack(spacing: 0) {
Toggle("Use xyz ?", isOn: $myViewModel.turnToggleOn).onChange(of: myViewModel.turnToggleOn, perform: { userTurnedOn in
print("on change called")
myViewModel.shouldUseToggle(userTurnedOn: userTurnedOn)
})
}
}
}
class MyViewModel: ObservableObject {
@Published var turnToggleOn = false
func shouldUseToggle(userTurnedOn: Bool) {
///some complex logic comes here, for simplicity I use random numbers
print("shouldUseToggle called")
let x = Int.random(in: 0..<10)
print(x)
if userTurnedOn {
turnToggleOn = x > 5
} else {
turnToggleOn = x > 3
}
}
}
使用自定義綁定並直接從綁定調用您的邏輯函數。
struct ContentView: View {
@StateObject var myViewModel = MyViewModel()
var body: some View {
VStack(spacing: 0) {
Toggle("Use xyz ?", isOn: Binding(get: {myViewModel.turnToggleOn}, set: {
myViewModel.turnToggleOn = $0;
myViewModel.shouldUseToggle(userTurnedOn: $0)
}))
}
}
}
class MyViewModel: ObservableObject {
var turnToggleOn = false
func shouldUseToggle(userTurnedOn: Bool) {
///some complex logic comes here, for simplicity I use random numbers
print("shouldUseToggle called")
let x = Int.random(in: 0..<10)
print(x)
if userTurnedOn {
turnToggleOn = x > 5
} else {
turnToggleOn = x > 3
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.