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

SwiftUI调用函数后@Published/@ObservedObject变量视图不更新问题排查

问题原因

你的核心问题是两个视图持有了完全独立的Query实例:

  • 主视图TestView初始化了一个Query实例,用来渲染列表
  • 弹窗CuisineTypePicker内部又单独初始化了一个新的Query实例,你调用筛选方法修改的是这个独立实例的queriedList属性,和主视图渲染用的实例没有任何关联,自然不会触发主视图更新。

修复步骤

1. 修改弹窗视图的参数定义

打开CuisineTypePicker的代码,删除内部自行创建Query实例的代码,改为接收父视图传入的实例:

struct CuisineTypePicker: View {
    
    @State private var cuisineTypes = ["filter", "American", "Chinese", "French"]
    @Environment(\.presentationMode) var presentationMode

    @Binding var selectedCuisineType: String
    @State var gfSelected = false
    
    // 删除原来的 let query = Query(),改成下面这行,接收外部传入的实例
    @ObservedObject var query: Query
       
    // 其余代码保持不变
}

2. 主视图弹出弹窗时传入自身持有的Query实例

修改TestView中sheet的内容构造代码,把自己的query实例传给弹窗:

.sheet(isPresented: $showMonPicker, onDismiss: {
    //optional function when picker dismissed
}, content: {
    // 新增query参数,传入当前视图持有的实例
    CuisineTypePicker(selectedCuisineType: $monFilter, query: query)
})

可选优化项

如果你的项目最低支持iOS 14+,建议把TestView中的@ObservedObject var query = Query()改为@StateObject var query = Query(),@StateObject会负责持有ObservableObject实例的生命周期,避免视图刷新时意外重建实例导致数据丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:54:05