为什么数据正在返回,但SwiftUi没有更新Text



我可以通过闭包传递回数据,所以传递了新名称,但我的UI没有更新。当我返回到原始视图时,会打印出用户的新名称,但按钮上方的文本没有得到新值。

在我看来,更新startingUser应该足以更新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)")
}
}
}

我的编辑视图:

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
}
}

更新

使用这些更改解决了问题,但我的问题仍然有效,无法理解旧代码不起作用的正确原因,在其他项目中,工作表和文本依赖于它正在起作用的相同@state-var。

添加

@State private var show = false

添加

.onTapGesture {
startingUser = UserData(name: "Start User")
show = true
}

更改

.sheet(isPresented: $show) {
DetailView(user: startingUser ?? UserData.example) { newOnePassedFromWhatDoneInEDitView in
startingUser = newOnePassedFromWhatDoneInEDitView
print("✅ (startingUser!.name)")
}
}

Text没有向您显示您在闭包中传递的更新用户名的原因是,当您关闭工作表时,您的startingUser属性将设置为nil,因为您已将该属性与sheet绑定。现在,在调用callBackClosure(newData)之后,您将调用dismiss()来解除工作表。为了克服这个问题,你可以尝试这样的方法。

struct ContentView: View {
@State private var startingUser: UserData?
@State private var updatedUser: UserData?

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

我建议您阅读sheet(item:onDismiss:content:)的Apple文档,并查看讨论部分的示例以获得更多了解。

最新更新