在我的代碼中,“最終”切換的值基于視圖模型中的復雜邏輯。例如,用戶打開開關,但如果不滿足某些條件,邏輯可以將其關閉(此處簡化為數字比較)。問題:在用戶打開切換后,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
}
}
}
uj5u.com熱心網友回復:
使用自定義系結并直接從系結呼叫您的邏輯函式。
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
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/313643.html
