Mam ten kod do prezentacji 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)
                }
            }
        }
    }
}

Dlaczego wynik wydruku jest "URL - Nil" i jak mogę wprowadzić te zmiany w kolejności?

1
belkavkolese 5 czerwiec 2021, 15:39

2 odpowiedzi

Najlepsza odpowiedź
struct URLFullCoverView: View {
    @State var url: URL?
    
    var body: some View {
        VStack {
            Button(action: {
                url = URL(string: "https://www.google.com")
            }, label: {
                Text("Tap me")
            })
            //This initializer will give you the current value
            .fullScreenCover(item: $url, content: {newUrl in
                Text(newUrl.absoluteString)
            })
        }
    }
}
//With this extension you can make it conform to Identifiable
extension URL : Identifiable{
    public var id: String {
        //UUID().uuidString
        //or
        self.absoluteString
    }
}
1
lorem ipsum 5 czerwiec 2021, 19:51

Dlaczego tak się dzieje, nie wiem, ale to zazwyczaj robię, aby uniknąć tego problemu:

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)
                }
            }
        }
    }
}
2
workingdog 5 czerwiec 2021, 23:39