SwiftUI何时触发视图更新?修改State变量后为何未立刻刷新界面
SwiftUI 视图更新时机说明
为什么修改round后body没有立刻更新?
SwiftUI 对@State属性的变更采用批量合并更新策略:
- 所有在同一个主线程同步代码块内的
@State修改,都会被SwiftUI暂存,不会立刻触发body的重新计算 - 只有当当前正在执行的同步函数(也就是你的
flagTapped函数)完全执行完毕,回到主线程RunLoop的空闲阶段时,SwiftUI才会汇总所有发生变更的@State属性,一次性计算新的body,完成视图更新 - 这种设计可以避免多次修改State导致的重复无意义渲染,大幅提升视图渲染效率
以你提供的代码为例,你在flagTapped函数中可能先后修改round、score、countries、correctAnswer、shouldShowWrongAnswer多个@State属性,这些变更会被合并为一次更新,只会触发一次body重绘,而不是每修改一个属性就更新一次。
额外注意
你的示例代码中还缺少shouldShowGameEnded的@State定义,直接运行会报未定义变量的错误,需要补充对应声明:
@State private var shouldShowGameEnded = false
内容的提问来源于stack exchange,提问作者Sotiris Kaniras
相关产品推荐
相关产品推荐

