在SwiftUI中关闭WKWebView

在SwiftUI中关闭WKWebView,swift,navigation,swiftui,wkwebview,Swift,Navigation,Swiftui,Wkwebview,我不熟悉Swift,不熟悉使用SwiftUI构建应用程序 我正在使用类似于我在下面编写的代码显示WKWebView struct SomeView: View { @State var showWebView = false var body: some View { ZStack { Button(action: { self.showWebView.toggle() }) {

我不熟悉Swift,不熟悉使用SwiftUI构建应用程序

我正在使用类似于我在下面编写的代码显示WKWebView

struct SomeView: View {

    @State var showWebView = false

    var body: some View {
        ZStack {
            Button(action: {
                self.showWebView.toggle()

            }) {
                Text("Go To WebView")
                    .padding()
                    .foregroundColor(.black)
                    .font(.title)
            }
            .sheet(isPresented: $showWebView, content: {
                WebView(url: "https://www.apple.com/")
            })
        }
    }
}

struct WebView: UIViewRepresentable {

    var url: String

    func makeCoordinator() -> Coordinator {
        return Coordinator()
    }

    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        return webView
    }

    func updateUIView(_ uiView: WebView.UIViewType, context: UIViewRepresentableContext<WebView>) {
        let urlRequest = URLRequest.init(url: URL.init(string: self.url)!)
        uiView.navigationDelegate = context.coordinator
        uiView.load(urlRequest)
    }
}

class Coordinator: NSObject, WKNavigationDelegate {

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction,
                 decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if let url = navigationAction.request.url?.absoluteString {
            if url.contains("apple") {
                let someViewModel = SomeViewModel()
                someViewModel.processRequest(url: url)
            }
        }
        decisionHandler(.allow)
    }
}
struct SomeView:View{
@状态变量showWebView=false
var body:一些观点{
ZStack{
按钮(操作:{
self.showWebView.toggle()
}) {
文本(“转到网络视图”)
.padding()
.foregroundColor(.黑色)
.font(.title)
}
.sheet(显示:$showWebView,内容:{
网络视图(url:)https://www.apple.com/")
})
}
}
}
结构WebView:UIViewRepresentable{
var url:String
func makeCoordinator()->Coordinator{
返回协调员()
}
func makeUIView(上下文:context)->WKWebView{
让webView=WKWebView()
返回webView
}
func updateUIView(uiView:WebView.UIViewType,context:UIViewRepresentableContext){
让urlRequest=urlRequest.init(url:url.init(string:self.url)!)
uiView.navigationDelegate=context.coordinator
uiView.load(urlRequest)
}
}
类协调器:NSObject,WKNavigationDelegate{
func webView(webView:WKWebView,导航操作的决策:WKNavigationAction,
decisionHandler:@escaping(WKNavigationActionPolicy)->Void){
如果让url=navigationAction.request.url?.absoluteString{
如果url.contains(“苹果”){
让someViewModel=someViewModel()
processRequest(url:url)
}
}
决策处理程序(.allow)
}
}

代码按预期工作。我能够显示所需网站的WKWebView。然而,在调用
someViewModel.processRequest()
之后,我正在努力找出如何关闭WKWebView并导航到另一个页面。你能帮忙吗?

我会把整个WebView做得稍微不同一点,这应该(据我所知)解决你的问题:

import SwiftUI
import SafariServices

struct SomeView: View {

    @State var showWebView = false

    var body: some View {
        ZStack {
            Button(action: {
                self.showWebView.toggle()

            }) {
                Text("Go To WebView")
                    .padding()
                    .foregroundColor(.black)
                    .font(.title)
            }
            .sheet(isPresented: $showWebView, content: {
                WebView(url: URL(string: "https://www.apple.com/")!) })

        }
    }
}

struct WebView: UIViewControllerRepresentable {

    let url: URL

    func makeUIViewController(context: UIViewControllerRepresentableContext<WebView>) -> SFSafariViewController {
        return SFSafariViewController(url: url)
    }

    func updateUIViewController(_ uiViewController: SFSafariViewController, context: UIViewControllerRepresentableContext<WebView>) {
    }

}
导入快捷界面
进口狩猎服务
结构SomeView:View{
@状态变量showWebView=false
var body:一些观点{
ZStack{
按钮(操作:{
self.showWebView.toggle()
}) {
文本(“转到网络视图”)
.padding()
.foregroundColor(.黑色)
.font(.title)
}
.sheet(显示:$showWebView,内容:{
WebView(url:url(字符串):https://www.apple.com/")!) })
}
}
}
结构WebView:UIViewControllerRepresentable{
让url:url
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->SFSafariViewController{
返回SFSafariViewController(url:url)
}
func updateUIViewController(uViewController:SFSafariViewController,上下文:UIViewControllerRepresentableContext){
}
}