每当我调用视图CardronaView()时,@State变量将被加载正确的数据大约3秒钟,然后它将被重置为默认值,即一个空字符串。我怎样才能解决这个问题?我正在用这个来调用新视图:
NavigationView {
List {
// MARK: - Display Cardrona
NavigationLink(destination: CardronaView()) {
ZStack(alignment: .topLeading) {
Image("Cardrona-header")
Text("Cardrona").font(.largeTitle).fontWeight(.semibold).foregroundColor(Color.black)
Text(cardTemp).foregroundColor(Color.black).padding(.top, 50).font(.title3)
}
}
}
}
新视图中的代码是这样的:
struct CardronaView: View {
@State var cardDate: String = ""
var body: some View {
List {
Text(cardDate)
}.onAppear {
Api().getJsonCard { (Cardrona) in
cardDate = "\(Cardrona.data_updated)"
}
}
}
}
答案 0 :(得分:0)
发出网络请求时,最好在加载下一个视图之前执行该请求。这样做有很多充分的理由,以防万一调用不成功,未加载新视图并避免不良的用户体验。在此处,您会向用户显示警报,提示无法拨打电话。
如果网络调用成功,则将结果传递到新视图并进行填充。
由于网络调用是异步的,因此您在进行.onAppear调用时,如果调用花费的时间太长,您将看到空的String,因为视图已被加载。
我以在先例视图上进行网络调用的方式更改了您的代码。但是也许您应该在用户点击ListCell时添加代码,如果调用成功,则NavigationLink会触发其目标参数CardonaView(cardDate:)。
struct ContentView: View {
@State var cardDate: String = ""
var body: some View {
NavigationView {
List {
// MARK: - Display Cardrona
NavigationLink(destination: CardronaView(cardDate: cardDate)) {
ZStack(alignment: .topLeading) {
Image("Cardrona-header")
Text("Cardrona").font(.largeTitle).fontWeight(.semibold).foregroundColor(Color.black)
Text(cardTemp).foregroundColor(Color.black).padding(.top, 50).font(.title3)
}
}
}
}
.onAppear {
Api().getJsonCard { (Cardrona) in
cardDate = "\(Cardrona.data_updated)"
}
}
}
struct CardronaView: View {
var cardDate: String
var body: some View {
List {
Text(cardDate)
}
}
}