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
相关产品推荐
相关产品推荐

