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
相关产品推荐
相关产品推荐

