Отключить WKWebView в SwiftUI - PullRequest
1 голос
/ 05 мая 2020

Я новичок в 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)
    }
}

код работает как положено. Я могу отобразить WKWebView, показывающий желаемый веб-сайт. Однако я изо всех сил пытаюсь понять, как закрыть WKWebView и перейти на другую страницу после того, как я вызвал someViewModel.processRequest(). Не могли бы вы помочь?

1 Ответ

1 голос
/ 05 мая 2020

Я бы сделал весь 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>) {
    }

}
...