SwiftUI父视图修改子视图@State变量不触发重渲染如何解决?
问题解决方法
问题根源
@State是SwiftUI为视图设计的私有状态属性包装器,仅允许在视图内部修改,外部直接修改@State属性不会触发视图重绘。- SwiftUI的View是值类型,你在父视图中提前初始化存储的
customView实例只是静态初始值,后续修改它的属性不会同步到渲染层的视图上。
正确实现方案
采用@State + @Binding的组合实现父视图控制子视图状态,符合SwiftUI单向数据流规则:
1. 修改子视图CustomView
将原本的@State修改为@Binding,用于接收外部传入的可读写状态:
struct CustomView: View { enum ViewType: String { case first, second, third } @Binding var viewType: ViewType var body: some View { content } @ViewBuilder private var content: some View { switch viewType { case .first: Text("The first view") case .second: Text("The second view") case .third: Text("The last view") } } }
2. 修改父视图ContentView
父视图作为数据源持有者,用@State存储状态,将绑定传入子视图,直接修改自身状态即可触发父子视图同步刷新:
struct ContentView: View { @State private var currentViewType: CustomView.ViewType = .first var body: some View { VStack(spacing: 40) { CustomView(viewType: $currentViewType) Button("Change") { currentViewType = .second } } } }
补充说明
如果子视图存在自己修改viewType的场景,@Binding本身也支持子视图内部直接赋值修改,不需要额外调整代码。
内容的提问来源于stack exchange,提问作者Tal Cohen
相关产品推荐
相关产品推荐

