193 字
1 分钟
SwifUI中使用WKWebView
import WebKitimport SwiftUI
struct WebView: UIViewRepresentable { typealias UIViewType = WKWebView
let webView: WKWebView
func makeUIView(context: Context) -> WKWebView { return webView }
func updateUIView(_ uiView: WKWebView, context: Context) { }}
class WebViewNavigationDelegate: NSObject, WKNavigationDelegate { func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { // TODO decisionHandler(.allow) }
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { // TODO decisionHandler(.allow) }}
class WebViewModel: ObservableObject { let webView: WKWebView
private let navigationDelegate: WebViewNavigationDelegate
init() { let configuration = WKWebViewConfiguration() configuration.websiteDataStore = .nonPersistent() webView = WKWebView(frame: .zero, configuration: configuration) navigationDelegate = WebViewNavigationDelegate()
webView.navigationDelegate = navigationDelegate setupBindings() }
@Published var urlString: String = "" @Published var canGoBack: Bool = false @Published var canGoForward: Bool = false @Published var isLoading: Bool = false
private func setupBindings() { webView.publisher(for: \.canGoBack) .assign(to: &$canGoBack)
webView.publisher(for: \.canGoForward) .assign(to: &$canGoForward)
webView.publisher(for: \.isLoading) .assign(to: &$isLoading)
}
func loadUrl() { guard let url = URL(string: urlString) else { return }
webView.load(URLRequest(url: url)) }
func loadHTML(html: String) { webView.loadHTMLString(html, baseURL: nil) }
func goForward() { webView.goForward() }
func goBack() { webView.goBack() }}