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

SwiftUI如何通过视图Toggle修改/访问@Published变量的值

问题原因
  • 你当前的MainView和PasswordView各自初始化了独立的PasswordManager实例,两个实例之间没有关联:你在MainView通过Toggle修改的是当前页面持有的PasswordManager属性,跳转后PasswordView使用的是全新初始化的实例,默认两个布尔值均为false,自然读取不到修改后的值。
  • @Published本身支持永久修改变量值,你遇到的问题和@Published的能力无关,只是修改和读取的不是同一个对象导致的。
解决方案

核心逻辑是让两个视图共用同一个PasswordManager实例,仅需修改两处代码即可:

  1. 修改MainView中的NavigationLink代码,把当前页面持有的manager实例传递给PasswordView
// 原代码
NavigationLink(destination: PasswordView(), label: {
    Text("Generate")
})
// 修改后代码
NavigationLink(destination: PasswordView(manager: manager), label: {
    Text("Generate")
})
  1. 修改PasswordView的代码,移除内部的实例初始化逻辑,改为接收外部传递的PasswordManager实例
import SwiftUI

struct PasswordView: View {
    // 移除原来的 = PasswordManager() 初始化逻辑,改为接收外部参数
    @ObservedObject var manager: PasswordManager

    var body: some View {
        Text(manager.generatePassword())
    }
}
可选优化建议
  • 如果PasswordManager需要在更多页面共用,可以在MainView的外层通过.environmentObject注入实例,后续子视图直接用@EnvironmentObject读取即可,不需要逐个页面手动传递
  • 可以给generatePassword方法补充剩余两种布尔组合(仅开启数字、仅开启特殊字符)的生成逻辑,覆盖所有用户选择场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:06:01