SwiftUI修改SettingView的isDynamic设置后SongbookView未检测到变更问题
问题根因
你当前的代码中,SongbookView和SettingView各自初始化了独立的UserSettings实例,两个实例之间没有任何关联,所以在设置页修改的配置只会作用于设置页自己持有的对象,主页完全感知不到变更。
两个视图中都存在如下代码,每次页面加载都会新建一份配置对象,是问题的核心来源:
@ObservedObject var userSettings = UserSettings()
修复方案
你只需要让两个视图共享同一份UserSettings实例即可,修改2处代码就行:
- 修改
SettingView的userSettings声明,改为从外部传入,不要自己初始化:
// 原来的代码:@ObservedObject var userSettings = UserSettings() // 修改为: @ObservedObject var userSettings: UserSettings
- 在
SongbookView弹出设置页的代码处,把自身持有的userSettings实例传给设置页:
// 原来的代码: // .sheet(isPresented: $isSettings) { // SettingView(isPresented: $isSettings) // } // 修改为: .sheet(isPresented: $isSettings) { SettingView(userSettings: userSettings, isPresented: $isSettings) }
修改完成后,设置页修改isDynamic配置时,@Published属性会通知所有订阅该实例的观察者,主页就会自动触发UI刷新,切换对应的搜索栏组件。
可选优化(全局共享配置)
如果你的App多个页面都需要用到用户配置,可以把UserSettings注入到环境变量中,避免逐层传参:
- 在App入口处注入实例:
@main struct YourApp: App { let userSettings = UserSettings() var body: some Scene { WindowGroup { SongbookView(isSettings: false) .environmentObject(userSettings) } } }
- 两个视图中把
@ObservedObject声明改为@EnvironmentObject,不需要手动初始化和传参:
@EnvironmentObject var userSettings: UserSettings
内容的提问来源于stack exchange,提问作者oculorum
相关产品推荐
相关产品推荐

