为何UIViewRepresentable实现的ContainerViewA可正常绑定而ContainerViewB不行?
核心问题出在UIHostingController的创建时机和SwiftUI状态更新链路的绑定关系上:
ContainerViewA(Coordinator中创建HostingController)
Coordinator是SwiftUI专门为UIViewRepresentable管理的协调对象,它的生命周期完全和视图的状态更新同步。当外部@State或Binding变化时,SwiftUI会触发updateUIView方法,你可以通过Coordinator获取到持有的UIHostingController,并更新其rootView的绑定参数——这就保证了内部SwiftUI视图能实时感知外部状态变化,同时内部视图的输入也能通过Binding反向同步回外部状态,整个链路都在SwiftUI的状态管理体系里。ContainerViewB(makeUIView中创建HostingController)
makeUIView方法只会在视图首次初始化时执行一次,后续不管外部状态怎么变,这个方法都不会再触发。你在这里创建的UIHostingController,其rootView的Binding参数只是初始化时的“静态快照”,之后外部状态更新时,没有任何机制通知这个HostingController去更新rootView的绑定。相当于这个HostingController直接脱离了SwiftUI的动态状态更新链路:内部TextField的输入无法同步回外部@State,外部的状态变化也传不到内部视图里。
直白点说:B方案的HostingController是“一锤子买卖”式的创建,没和SwiftUI的状态更新机制挂钩,自然没法处理Binding的双向同步。
内容的提问来源于stack exchange,提问作者Andrei Herford

