didFinish 委托未在 swiftUI 中被调用
didFinish delegate not getting called in swiftUI
我正试图在 WKWebView
完成加载时隐藏初始视图。所以在我的 WebView.swift
文件中,我有一个包含 didFinish 委托的协调器。我在 didFinish 委托函数中放置了一条打印语句,但是当 运行 应用程序时,一旦 webView 完成加载,我就没有在我的调试控制台中看到该打印语句。我也尝试过使用断点,但没有任何区别。请记住,我也没有显示任何错误。这是我的 WebView.swift
文件:
import SwiftUI
import WebKit
struct SwiftUiWebView: UIViewRepresentable {
class Coordinator: NSObject, WKNavigationDelegate {
let parent: SwiftUiWebView
init(_ parent: SwiftUiWebView) {
self.parent = parent
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("Done loading")
}
}
func makeCoordinator() -> SwiftUiWebView.Coordinator {
Coordinator(self)
}
let url: URL?
func makeUIView(context: Context) -> WKWebView {
let prefs = WKWebpagePreferences()
prefs.allowsContentJavaScript = true
let config = WKWebViewConfiguration()
config.defaultWebpagePreferences = prefs
return WKWebView(frame: .zero, configuration: config)
}
func updateUIView(_ uiView: WKWebView, context: Context) {
guard let myURL = url else {
return
}
let request = URLRequest(url: myURL)
uiView.load(request)
}
}
并且 SwiftUiWebview
在 ContentView.swift
中被调用,例如:
SwiftUiWebView(url: URL(string: "www.mywebsitename.com"))
有人知道我做错了什么吗?
您需要在 WKWebView
上设置导航委托,否则它永远不会被调用。
您可以在 updateUIView
调用中执行此操作,方法是从上下文中访问您的协调器并将 navigationDelegate
设置为 context.coordinator
。
func updateUIView(_ uiView: WKWebView, context: Context) {
guard let myURL = url else {
return
}
uiView.navigationDelegate = context.coordinator // <- This sets the delegate
let request = URLRequest(url: myURL)
uiView.load(request)
}
完成后,如果您实现了所有 navigationDelegate 函数,则应调用它们。
我正试图在 WKWebView
完成加载时隐藏初始视图。所以在我的 WebView.swift
文件中,我有一个包含 didFinish 委托的协调器。我在 didFinish 委托函数中放置了一条打印语句,但是当 运行 应用程序时,一旦 webView 完成加载,我就没有在我的调试控制台中看到该打印语句。我也尝试过使用断点,但没有任何区别。请记住,我也没有显示任何错误。这是我的 WebView.swift
文件:
import SwiftUI
import WebKit
struct SwiftUiWebView: UIViewRepresentable {
class Coordinator: NSObject, WKNavigationDelegate {
let parent: SwiftUiWebView
init(_ parent: SwiftUiWebView) {
self.parent = parent
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("Done loading")
}
}
func makeCoordinator() -> SwiftUiWebView.Coordinator {
Coordinator(self)
}
let url: URL?
func makeUIView(context: Context) -> WKWebView {
let prefs = WKWebpagePreferences()
prefs.allowsContentJavaScript = true
let config = WKWebViewConfiguration()
config.defaultWebpagePreferences = prefs
return WKWebView(frame: .zero, configuration: config)
}
func updateUIView(_ uiView: WKWebView, context: Context) {
guard let myURL = url else {
return
}
let request = URLRequest(url: myURL)
uiView.load(request)
}
}
并且 SwiftUiWebview
在 ContentView.swift
中被调用,例如:
SwiftUiWebView(url: URL(string: "www.mywebsitename.com"))
有人知道我做错了什么吗?
您需要在 WKWebView
上设置导航委托,否则它永远不会被调用。
您可以在 updateUIView
调用中执行此操作,方法是从上下文中访问您的协调器并将 navigationDelegate
设置为 context.coordinator
。
func updateUIView(_ uiView: WKWebView, context: Context) {
guard let myURL = url else {
return
}
uiView.navigationDelegate = context.coordinator // <- This sets the delegate
let request = URLRequest(url: myURL)
uiView.load(request)
}
完成后,如果您实现了所有 navigationDelegate 函数,则应调用它们。