ios - 为什么在 SwiftUI 中不按顺序执行状态更改?
问题描述
我有这段代码用于展示 SafariView
struct ContentView: View {
@ObservedObject var viewModel: ContentViewModel
@State var url: URL?
@State var toShowSafari: Bool = false
var body: some View {
VStack {
Button(action: {
url = URL(string: "https://www.google.com")
toShowSafari = true
}, label: {
Text("Tap me")
}).fullScreenCover(isPresented: $toShowSafari) {
let _ = print("url - \(url)")
if let url = url {
SafariView(url: url)
}
}
}
}
}
为什么这里的打印结果是“url - nil”,我怎样才能使这些更改按顺序执行?
解决方案
我不知道为什么会发生这种情况,但这是我通常为避免此问题而采取的措施:
class Selected: ObservableObject {
@Published var url: URL?
}
struct ContentView: View {
@ObservedObject var viewModel: ContentViewModel
@StateObject var selected = Selected() // <---
@State var toShowSafari: Bool = false
var body: some View {
VStack {
Button(action: {
selected.url = URL(string: "https://www.google.com")
toShowSafari = true
}, label: {
Text("Tap me")
}).fullScreenCover(isPresented: $toShowSafari) {
let _ = print("url - \(selected.url)")
if let url = selected.url {
SafariView(url: url)
}
}
}
}
}
推荐阅读
- c# - 正确使用 String.Format - C#
- java - 如何杰克逊序列化/反序列化物料清单实体
- python - Python Selenium - 列出同一类的所有文本
- android - 更新了 Android Studio 无法识别 Kotlin 函数(2020.3.1 补丁 3)
- python - 使用 ffmpeg 删除视频的多个部分
- c - 为什么在某些应用程序中链表优先于数组?
- javascript - 如何不在逻辑中包含空值
- virtualbox - 登录前启动 virtualbox guestaddition
- javascript - 如何在反应js中的切换按钮上停止歌曲
- python - 错误 python websocket 服务器:解包需要 1 个字节的缓冲区