首页 > 解决方案 > 为什么在 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”,我怎样才能使这些更改按顺序执行?

标签: iosswiftswiftui

解决方案


我不知道为什么会发生这种情况,但这是我通常为避免此问题而采取的措施:

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

推荐阅读