SwiftUI问题:复用视图关联的计算属性无法正常更新
问题分析与解决思路
核心问题:状态传递方式错误
你当前的代码存在状态管理逻辑错误:
RatingView用@State声明rating,但这个rating是从父视图ScoringView传入的普通变量,属于值传递——子视图拿到的是初始值0的副本,修改的只是自己内部的独立状态,完全不会同步回父视图的原变量。ScoringView里的storyRating等是普通变量,本身不具备SwiftUI的状态监听能力,就算子视图能修改它,也不会触发视图刷新,roundScore自然永远计算初始的0值。
修复步骤
1. 把父视图的变量改为状态变量
在 ScoringView 中,给需要被修改的评分变量加上 @State 修饰,让它们成为SwiftUI可监听的状态:
struct ScoringView: View { let story = "Story" let cheese = "Cheese" let love = "Romance" let actor = "In character" @State var storyRating = 0 @State var cheesyRating = 0 @State var loveRating = 0 @State var actorRating = 0 // 其余代码不变 }
2. 子视图改用绑定类型接收状态
RatingView 需要和父视图的状态双向同步,把内部的 @State 换成 @Binding,这样它就能直接操作父视图的状态:
struct RatingView: View { let criteria: String @Binding var rating: Int // 替换@State为@Binding // 其余body代码保持不变 }
3. 传递绑定引用给子视图
在 ScoringView 创建 RatingView 时,用 $ 符号传递绑定引用,而不是普通值:
VStack { RatingView(criteria: story, rating: $storyRating) RatingView(criteria: cheese, rating: $cheesyRating) RatingView(criteria: love, rating: $loveRating) RatingView(criteria: actor, rating: $actorRating) }
效果验证
修改完成后,点击 RatingView 的按钮会直接修改父视图的评分状态,roundScore 计算属性会实时获取最新的评分总和,底部的分数文本也会自动刷新显示当前值。
内容的提问来源于stack exchange,提问作者Pedro Cerrano
相关产品推荐
相关产品推荐

