You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何从嵌套视图实时更新父视图营养统计?

解决SwiftUI中顶部营养总和不实时更新的问题

问题分析

当前顶部总和不更新的核心原因有两个:

  1. 持有TemporaryMealIngredients的方式错误:使用@State存储引用类型的ObservableObject,无法正确监听其内部变化。
  2. IngredientItem(推测为Core Data实体,引用类型)的属性修改不会触发@Published var ingredients的更新通知,导致计算属性(如carbs)无法重新计算。

解决方案

步骤1:修正ObservableObject的持有方式

将MealPrepView中的@State var temporaryMeal改为@StateObject,这是SwiftUI中持有ObservableObject的正确方式:

// MealPrepView中替换原有的@State声明
@StateObject var temporaryMeal: TemporaryMealIngredients = TemporaryMealIngredients()

步骤2:监听单个食材的属性变化

修改TemporaryMealIngredients类,添加Combine订阅,监听每个IngredientItem的属性变化,当任意食材属性修改时,主动触发自身的更新通知:

import Combine

class TemporaryMealIngredients: ObservableObject
{
    @Published var ingredients: [IngredientItem] = []
    private var cancellables = Set<AnyCancellable>()
    
    var carbs: Float {
        ingredients.map({$0.carbs}).reduce(0,+)
    }
    var proteins: Float{
        ingredients.map({$0.proteins}).reduce(0,+)
    }
    var fats: Float{
        ingredients.map({$0.fats}).reduce(0,+)
    }
    var carbsblocks: Float {
        carbs / 9
    }
    var proteinsblocks: Float {
        proteins / 7
    }
    var fatsblocks: Float {
        fats / 3
    }
    
    init() {
        // 订阅食材数组的变化,同时监听每个食材的属性更新
        $ingredients
            .flatMap { ingredients in
                Publishers.MergeMany(ingredients.map { $0.objectWillChange })
            }
            .sink { [weak self] _ in
                self?.objectWillChange.send()
            }
            .store(in: &cancellables)
    }
    
    func clear(){
        ingredients = []
    }
}

额外检查:确保食材修改的绑定正确

确认IngredientCellEditQ中是通过绑定(Binding<IngredientItem>)修改食材的克数和营养属性,而非直接修改值。例如:

// IngredientCellEditQ的示例结构
struct IngredientCellEditQ: View {
    @Binding var passedIngredient: IngredientItem
    
    var body: some View {
        TextField("克数", value: $passedIngredient.grams, format: .number)
        // 其他营养显示逻辑
    }
}

这样修改后,当你在列表中修改任意食材的克数时,顶部的营养总和会实时更新。

内容的提问来源于stack exchange,提问作者Irene Ferfoglia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:05:24