一旦新的 SwiftUI 视图完全加载,@State 变量就会被清除
Posted
技术标签:
【中文标题】一旦新的 SwiftUI 视图完全加载,@State 变量就会被清除【英文标题】:@State variable is cleared once new SwiftUI view has been fully loaded 【发布时间】:2020-07-17 00:45:12 【问题描述】:每当我调用视图 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)"
【问题讨论】:
如果你通过某种数据模型从第一视图传递数据,你会得到更好的结果。也使用像这种云这样的东西是更好的方法@ObservedObject 【参考方案1】:发出网络请求时,最好在加载下一个视图之前执行它。这样做有很多很好的理由,因为如果调用不成功,则不会加载新视图并避免糟糕的用户体验。您可以在此处向用户显示无法拨打电话的警报。
如果网络调用成功,您将结果传递给新视图并填充它。
由于网络调用是异步的,并且您进行此调用 .onAppear,如果调用时间过长,您将看到空字符串,因为您的视图已经加载。
我以在先例视图上进行网络调用的方式更改了您的代码。但也许你应该在用户点击 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)
【讨论】:
以上是关于一旦新的 SwiftUI 视图完全加载,@State 变量就会被清除的主要内容,如果未能解决你的问题,请参考以下文章