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

SwiftUI修改SettingView的isDynamic设置后SongbookView未检测到变更问题

问题根因

你当前的代码中,SongbookView和SettingView各自初始化了独立的UserSettings实例,两个实例之间没有任何关联,所以在设置页修改的配置只会作用于设置页自己持有的对象,主页完全感知不到变更。
两个视图中都存在如下代码,每次页面加载都会新建一份配置对象,是问题的核心来源:

@ObservedObject var userSettings = UserSettings()

修复方案

你只需要让两个视图共享同一份UserSettings实例即可,修改2处代码就行:

  1. 修改SettingView的userSettings声明,改为从外部传入,不要自己初始化:
// 原来的代码:@ObservedObject var userSettings = UserSettings()
// 修改为:
@ObservedObject var userSettings: UserSettings
  1. 在SongbookView弹出设置页的代码处,把自身持有的userSettings实例传给设置页:
// 原来的代码:
// .sheet(isPresented: $isSettings) {
//     SettingView(isPresented: $isSettings)
// }
// 修改为:
.sheet(isPresented: $isSettings) {
    SettingView(userSettings: userSettings, isPresented: $isSettings)
}

修改完成后,设置页修改isDynamic配置时,@Published属性会通知所有订阅该实例的观察者,主页就会自动触发UI刷新,切换对应的搜索栏组件。

可选优化(全局共享配置)

如果你的App多个页面都需要用到用户配置,可以把UserSettings注入到环境变量中,避免逐层传参:

  1. 在App入口处注入实例:
@main
struct YourApp: App {
    let userSettings = UserSettings()
    var body: some Scene {
        WindowGroup {
            SongbookView(isSettings: false)
                .environmentObject(userSettings)
        }
    }
}
  1. 两个视图中把@ObservedObject声明改为@EnvironmentObject,不需要手动初始化和传参:
@EnvironmentObject var userSettings: UserSettings

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:09:03