SwiftUI如何通过视图Toggle修改/访问@Published变量的值
问题原因
- 你当前的
MainView和PasswordView各自初始化了独立的PasswordManager实例,两个实例之间没有关联:你在MainView通过Toggle修改的是当前页面持有的PasswordManager属性,跳转后PasswordView使用的是全新初始化的实例,默认两个布尔值均为false,自然读取不到修改后的值。 @Published本身支持永久修改变量值,你遇到的问题和@Published的能力无关,只是修改和读取的不是同一个对象导致的。
解决方案
核心逻辑是让两个视图共用同一个PasswordManager实例,仅需修改两处代码即可:
- 修改
MainView中的NavigationLink代码,把当前页面持有的manager实例传递给PasswordView
// 原代码 NavigationLink(destination: PasswordView(), label: { Text("Generate") }) // 修改后代码 NavigationLink(destination: PasswordView(manager: manager), label: { Text("Generate") })
- 修改
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
相关产品推荐
相关产品推荐

