SwiftUI中如何将@ObservedObject的字符串isEmpty值传入@Binding?
解决方案
方案1:在视图模型中封装绑定逻辑
如果需要保留BoolView的@Binding声明(比如未来可能要支持修改操作),可以把绑定的构造逻辑移到视图模型中,让视图代码更简洁:
修改MainViewModel,添加返回Binding<Bool>的计算属性:
@MainActor final class MainViewModel: ObservableObject { @Published var magicString = "" // 封装绑定逻辑 var activeBinding: Binding<Bool> { Binding( get: { !self.magicString.isEmpty }, set: { _ in // 当前无需修改操作,留空即可;未来需要时可在此添加修改magicString的逻辑 } ) } init(magicString: String = "") { self.magicString = magicString } }
然后在MainView中直接传入该绑定:
struct MainView: View { @ObservedObject var viewModel: MainViewModel var body: some View { BoolView(active: viewModel.activeBinding) } }
方案2:改用只读属性简化视图
如果BoolView仅负责展示状态,不需要修改这个布尔值,完全可以去掉@Binding,改用普通的只读属性:
修改BoolView:
struct BoolView: View { // 替换@Binding为只读常量 let active: Bool var body: some View { HStack() { Image(systemName: active ? "checkmark.circle" : "xmark.circle") .foregroundStyle(active ? .green : .red) Text("Is magic happening?") Spacer() } } }
在MainView中直接传入计算后的布尔值:
struct MainView: View { @ObservedObject var viewModel: MainViewModel var body: some View { BoolView(active: !viewModel.magicString.isEmpty) } }
选择建议
- 若未来
BoolView需要支持修改操作(比如点击切换状态并同步更新magicString),优先选择方案1,后续可在视图模型的set闭包中补充修改逻辑; - 若
BoolView仅做展示用,方案2是最优解,代码更轻量高效,完全避免了手动构造绑定的繁琐。
内容的提问来源于stack exchange,提问作者Rodrigo Ruiz Murguía
相关产品推荐
相关产品推荐

