XUIView中Binding<Bool>无法感知值更新的原因排查
问题分析与解决:XUIView中Binding无法感知更新的问题
问题根源
你遇到的核心问题是:XUIView中保存的Binding<Bool>实例没有跟随SwiftUI状态更新同步。
在makeUIView阶段,你给XUIView传递了初始的Binding,但当customFlag状态变化时,SwiftUI会触发XView的updateUIView方法,此时XView的@Binding已经关联了最新的状态值,但XUIView内部还是持有创建时的旧Binding实例——这就导致调用_update时,读取的wrappedValue还是旧值,而SwiftUI的Text组件因为直接绑定@State,能自动感知状态变化更新。
解决方案
没错,你需要在updateUIView方法中给XUIView的customFlag赋值最新的Binding实例,确保XUIView使用的Binding始终关联当前最新的状态。
修改XView的updateUIView方法,取消注释那行关键代码:
func updateUIView(_ uiView: XUIView, context: Context) { Swift.print("XView: \(#function)") // 关键:更新XUIView的Binding实例,同步最新状态关联 uiView.customFlag = $customFlag Swift.print("XView: \(#function): customFlag: \(customFlag) \n--\($customFlag)") uiView._update() }
修改后效果
点击按钮后,控制台输出会变为:
XUIView: __preview___configure(): button action *** XView: __preview__updateUIView(_:context:) XView: __preview__updateUIView(_:context:): customFlag: true --Binding<Bool>(transaction: SwiftUI.Transaction(plist: []), location: SwiftUI.LocationBox<SwiftUI.Binding<Swift.Bool>.(unknown context at $10594f2e0).ScopedLocation>, _value: true) XUIView: __preview___update(): true --Binding<Bool>(transaction: SwiftUI.Transaction(plist: []), location: SwiftUI.LocationBox<SwiftUI.Binding<Swift.Bool>.(unknown context at $10594f2e0).ScopedLocation>, _value: true)
此时XUIView的按钮标题会正确更新为BUTTON:ON,和Text组件的状态完全保持一致。
内容的提问来源于stack exchange,提问作者Annett Schwarze
相关产品推荐
相关产品推荐

