SwiftUI中@Binding值设置后未更新的问题排查
问题原因与修复方案
核心错误
你遇到的问题根源是在PreviewProvider的previews闭包内直接声明@State变量。SwiftUI的@State是用于管理View内部状态的属性包装器,它必须属于某个View结构体的属性,才能被SwiftUI正确管理其生命周期。直接在返回View的闭包中临时声明@State,会导致状态无法被正确追踪,绑定传递后修改也不会同步,最终表现为date始终为nil。
修复后的代码
import SwiftUI struct ChildView: View { let entryLabel : String @Binding var date : Date? var body: some View { HStack(spacing:20) { Text(entryLabel) .font(.title3) Spacer() Button("Add Date") { date = Date.now print("add \(date)") } .buttonStyle(.bordered) } .padding(.horizontal,5) .padding(.vertical,10) } } // 创建专门的预览容器View,将@State放在这里 struct ChildViewPreviewContainer: View { @State private var date: Date? var body: some View { VStack { ChildView(entryLabel: "The label", date: $date) Text(date?.formatted() ?? "No Date") } .onChange(of: date) { newValue in print("changed") } } } struct ChildDateView_Previews: PreviewProvider { static var previews: some View { ChildViewPreviewContainer() } }
额外优化说明
原代码中let s = date?.formatted() ?? "No Date"直接写在VStack内部,该赋值只会在View初始化时执行一次,无法响应date的变化。将其直接放入Text的参数中,才能保证每次date更新时自动重新计算显示内容。
内容的提问来源于stack exchange,提问作者vagrant
相关产品推荐
相关产品推荐

