在我的代码中,“最后”切换的值基于视图模型中的复杂逻辑。例如,用户打开开关,但是如果某些条件不满足,逻辑可以关闭(下面简化为数字比较)。问题:当用户打开开关后,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
}
}
}
发布于 2021-10-13 14:10:22
使用自定义绑定,并直接从绑定调用逻辑函数。
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://stackoverflow.com/questions/69556883
复制相似问题