首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SwiftUI避免重复onChange调用

SwiftUI避免重复onChange调用
EN

Stack Overflow用户
提问于 2021-10-13 13:57:17
回答 1查看 975关注 0票数 1

在我的代码中,“最后”切换的值基于视图模型中的复杂逻辑。例如,用户打开开关,但是如果某些条件不满足,逻辑可以关闭(下面简化为数字比较)。问题:当用户打开开关后,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只对用户的更改做出反应,而不是对来自视图模型的更改做出反应。有办法这样做吗?或者用其他方法解决它?

代码语言:javascript
运行
复制
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
        }
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2021-10-13 14:10:22

使用自定义绑定,并直接从绑定调用逻辑函数。

代码语言:javascript
运行
复制
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
        }
    }
}
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69556883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档