You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI数据回传后Text视图未更新的问题及原因咨询

问题:Sheet回传数据后Text视图未更新

我用闭包实现了数据回传,新的用户名已经成功传回原视图,打印能看到新名称,但按钮上方的Text视图就是不更新。我本来以为更新startingUser变量就能让ContentView刷新,但没生效。

ContentView代码

@State private var startingUser: UserData?
        
var body: some View {
    
        VStack {
            Text(startingUser?.name ?? "no name")
            Text("Create start user")
                .onTapGesture {
                    startingUser = UserData(name: "Start User")
                }
        }
        .sheet(item: $startingUser) { userToSend in
            
            DetailView(user: userToSend) { newOnePassedFromWhatDoneInEDitView in
                startingUser = newOnePassedFromWhatDoneInEDitView
                print("✅ \(startingUser?.name)")
            }
        }

}

DetailView(编辑视图)代码

struct DetailView: View {
    
    @Environment(\.dismiss) var dismiss
    var user: UserData
    var callBackClosure: (UserData) -> Void

    @State private var name: String
    

    var body: some View {
        NavigationView {
            Form {
                TextField("your name", text: $name)
            }
            .navigationTitle("edit view")
            .toolbar {
                Button("dismiss") {
                    var newData = self.user
                    newData.name = name
                    newData.id = UUID()

                    callBackClosure(newData)
                    
                    dismiss()
                }
            }
        }
       
    
    }
    
    init(user: UserData,  callBackClosure: @escaping (UserData) -> Void ) {
        self.user = user
        self.callBackClosure = callBackClosure
        _name = State(initialValue: user.name)
    }
}

struct DetailView_Previews: PreviewProvider {
    static var previews: some View {
        DetailView(user: UserData.example) { _ in}
    }
}

数据模型代码

struct UserData: Identifiable, Codable, Equatable {
        
        var id = UUID()
        var name: String
        
        static let example = UserData(name: "Luke")
        
        static func == (lhs: UserData, rhs: UserData) -> Bool {
            lhs.id == rhs.id
        }

}

已解决但存在疑问

我通过以下修改解决了问题,但搞不懂原代码失效的原因——之前其他项目里,Sheet和Text依赖同一个@State变量的场景是能正常工作的。

修改内容:

  • 添加@State private var show = false
  • 修改点击手势代码:
.onTapGesture {
      startingUser = UserData(name: "Start User")
      show = true
      }
  • 修改Sheet触发方式为isPresented绑定:
.sheet(isPresented: $show) {
                DetailView(user: startingUser ?? UserData.example) { newOnePassedFromWhatDoneInEDitView in
                    startingUser = newOnePassedFromWhatDoneInEDitView
                    print("✅ \(startingUser!.name)")
                }
            }

内容的提问来源于stack exchange,提问作者biggreentree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:50:46